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

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

15.08.2008 03:25:31
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

6
15.08.2008 04:24:44

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

Вот мой маршрут в 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.");
        }
    }
}
0
15.08.2008 03:51:43

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

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
        );
6
15.08.2008 03:54:03

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

1
15.08.2008 04:27:58
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

0
30.01.2011 02:03:47