2008-08-15 9 views
13

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

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

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

The controller for path '/Page.aspx' could not be found or it does not implement the IController interface. Parameter name: controllerType

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

ответ

6

I just answered my own question. I had the routes backwards (Default was above page).

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

So this brings up the next question... how does the "Default" route match (I assume they use regular expressions here) the "Page" route?

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

0

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

Я просто ответил на мой собственный вопрос. У меня были маршруты назад (по умолчанию было выше страницы). Ниже приведен правильный порядок. Таким образом, возникает следующий вопрос ... как соответствует маршрут «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 
     ); 
1

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

0
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

 Смежные вопросы

  • Нет связанных вопросов^_^