2013-07-22 2 views
4

Я хочу создать простой движок блога. Для модного и чистого URL-адресов я хотел бы использовать механизм маршрутизации, реализованный в MVC4.ASP.NET MVC4 Пользовательская маршрутизация

Я добавил к RouteConfig.cs эти строки:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "ArticleList", 
      url: "Articles/{category}/{page}", 
      defaults: new 
          { 
           controller = "Articles", 
           category = UrlParameter.Optional, 
           page = 1 
          }); 
    } 
} 

И если я пишу в веб-браузере URL:

http://localhost:6666/Articles/SomeCategory/3 

Я хочу, чтобы перейти к этому контроллеру:

public class ArticlesController : ControllerBase<IHomeService> 
{ 
    public ActionResult Index(string category, int page = 0) 
    { 
     return View("~/Views/Article/Articles.cshtml"); 
    } 

} 

с параметрами категории = "SomeCategory" и страница = 1.

Все, что я получаю, это Ошибка сервера в '/' Application. Ресурс не найден.

Что не так?

+0

Не могли бы вы перечислить все ваши маршруты? –

ответ

5
 routes.MapRoute(
      name: "ArticleList", 
      url: "{controller}/{category}/{page}", 
      defaults: new 
      { 
       category = UrlParameter.Optional, 
       page = 1, 
       action = "Index" 
      }, 
      constraints: new 
      { 
       controller = "Articles" 
      } 
     ); 


     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

EDIT

Я должен добавить это к ответу, но я был в спешке:

  1. Регистрация пользовательских маршрутов первый, более пользовательских тем больше приоритета у них есть.
  2. В приведенном выше примере с использованием ограничений или жесткого кодирования маршрут дает тот же результат. Ограничения более гибкие, поскольку вы можете использовать регулярное выражение для ограничения значений контроллеров/действий/параметров, для которых предназначен ваш маршрут. Например, если вы добавляете новый маршрут, который использует/категорию шаблона/страницы ваш могут модифицировать ограничение контроллера соответственно:

    ограничения: новые { контроллера = @ «^ (Статьи | AnotherController) $» }

0

Проблема заключается в том, что у вас есть необязательный параметр в середине пути {controller}/{category}/{page}. У маршрутизации ASP.NET есть проблема с этим, потому что если категория не указана, у нее нет способа определить, что категория не указана. Существует решение для наличия дополнительных параметров в середине путей here. Он решает более общую проблему, но она также покрывает вашу проблему.

0

Чтобы включить маршрутизацию атрибутов, вызовите MapMvcAttributeRoutes во время конфигурации. Ниже приведен код.

 public class RouteConfig 
     { 
      public static void RegisterRoutes(RouteCollection routes) 
      { 
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
       routes.MapMvcAttributeRoutes(); 
      } 
     } 

В MVC5 мы можем комбинировать маршрутизацию атрибутов с маршрутизацией на основе условных обозначений. Ниже приведен код.

 public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapMvcAttributeRoutes(); 
      routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

Очень легко сделать параметр URI необязательным, добавив вопросительный знак к параметру маршрута. Мы также можем указать значение по умолчанию, используя параметр form = value. here - полная статья.