Сопоставление маршрутов 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

Я что-то здесь не делаю?

Ответов (5)

Решение

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

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

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

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

Не уверен, как выглядит ваш контроллер, ошибка, похоже, указывает на то, что он не может найти контроллер. Вы унаследовали от Controller после создания класса 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.");
        }
    }
}

На одном из MVC Storefront Роб Конрайте в скринкаста , он встречает именно этот вопрос. Если вам интересно, это около 23 минут.

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

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
        );
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