Отображение маршрутов ASP.Net MVC

Я новичок в MVC (и маршрутизации ASP.Net). Я пытаюсь сопоставить *.aspx с контроллером под названием PageController.

routes.MapRoute(
   "Page",
   "{name}.aspx",
   new { controller = "Page", action = "Index", id = "" }
);

Не будет ли код выше отображать *.aspx на PageController? Когда я запустил это и набрал любую страницу .aspx, я получаю следующую ошибку:

Контроллер для пути '/Page.aspx' не найден или он не реализует интерфейс IController. Имя параметра: controllerType

Есть ли что-то, что я здесь не делаю?

Ответы

Ответ 1

Я просто ответил на свой вопрос. я имел маршруты назад (по умолчанию было выше страницы).

Да, вы должны поместить все настраиваемые маршруты выше маршрута по умолчанию.

Итак, это поднимает следующий вопрос... как соответствует маршрут "По умолчанию" (I предположим, что они используют регулярные выражения здесь) маршрут "Страница"?

Маршрут по умолчанию совпадает с тем, что мы называем Конвенцией по конфигурации. Скотт Гатри объясняет это хорошо в своем первом сообщении в блоге на ASP.NET MVC. Я рекомендую вам прочитать его, а также его другие сообщения. Имейте в виду, что они были опубликованы на основе первого CTP, и структура изменилась. Вы также можете найти веб-трансляцию на ASP.NET MVC на сайте asp.net Скоттом Гензельмом.

Ответ 2

Я просто ответил на свой вопрос. У меня были маршруты назад (по умолчанию было выше страницы). Ниже приведен правильный порядок. Таким образом, возникает следующий вопрос... как соответствует маршрут "Default" (я предполагаю, что здесь используют регулярные выражения) маршрут "Страница"?

routes.MapRoute(
            "Page",
            "{Name}.aspx",
            new { controller = "Page", action = "Display", id = "" }
        );

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Ответ 3

На одном из браузеров Rob Conery MVC screencasts он сталкивается с этой точной проблемой. Если вы заинтересованы, отметьте отметку в 23 минуты.

Ответ 4

Не уверен, как выглядит ваш контроллер, кажется, что ошибка указывает на то, что он не может найти контроллер. Наследовали ли вы от контроллера после создания класса PageController? Является ли PageController расположенным в каталоге контроллеров?

Вот мой маршрут в Global.asax.cs

routes.MapRoute(
    "Page", 
    "{Page}.aspx", 
    new { controller = "Page", action = "Index", id = "" }
);

Вот мой контроллер, который находится в папке Controllers:

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class PageController : Controller
    {
        public void Index()
        {
            Response.Write("Page.aspx content.");
        }
    }
}

Ответ 5

public class AspxRouteConstraint : IRouteConstraint
{
    #region IRouteConstraint Members

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return values["aspx"].ToString().EndsWith(".aspx");
    }

    #endregion
}

зарегистрировать маршрут для всех aspx

  routes.MapRoute("all", 
                "{*aspx}",//catch all url 
                new { Controller = "Page", Action = "index" }, 
                new AspxRouteConstraint() //return true when the url is end with ".aspx"
               );

И вы можете проверить маршруты MvcRouteVisualizer