2014-09-03 2 views
0

В настоящее время я пытаюсь выполнить маршрут следующим образом.Продвинутая маршрутизация MVC.NET

  • / маршруты в главном контроллере, вид действия, "дом", как идентификатор
  • /somePageId Маршруты Home контроллера, вид действия, "somePageId" как идентификатор
  • /Видео маршруты для видеоконтроллера, действие индекса
  • /Видео/someVideoName маршруты для видеоконтроллера, видео-действие с идентификационным параметром как «someVideoName»
  • /Новости маршруты к контроллеру Новости, индекс действия
  • /Новости/someNewsId маршрутов к контроллеру новостей, вид действия, «someNewsId» в качестве идентификатора.

До сих пор, у меня есть следующий код:

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

routes.MapRoute(
    name: "NewsIndex", 
    url: "News", 
    defaults: new { controller = "News", action = "Index" }, 
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" } 
); 

routes.MapRoute(
    name: "NewsView", 
    url: "News/{id}", 
    defaults: new { controller = "News", action = "_", id = UrlParameter.Optional }, 
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" } 
); 

routes.MapRoute(
    name: "PageShortCut", 
    url: "{id}", 
    defaults: new { controller = "Home", action = "_", id = UrlParameter.Optional }, 
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" } 
); 

Если я иду в/Home/_/О, я могу просмотреть страницу, если я иду в/О, я просто получить 404.

Возможно ли это в mvc.net? Если да, то как я могу это сделать?

+3

Сторона примечания: порядок маршрутов в вашем образце обратный - маршрут по умолчанию будет соответствовать всем, и более конкретные маршруты никогда не будут проверены. Обязательно исправьте образец, чтобы показать разумный (наиболее специфичный для наименее специфического) порядок маршрутов до того, как будут сделаны какие-либо предложения. –

ответ

1

Попробуйте удалить UrlParameter.Optional с дороги PageShortCut. Вероятно, вам также придется изменить порядок маршрутов.

Это работает для меня (как последних двух маршрутов):

routes.MapRoute(
    name: "PageShortCut", 
    url: "{id}", 
    defaults: new { controller = "Home", action = "_" }, 
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" } 
); 

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

И мой контроллер:

public class HomeController : Controller { 
    public string Index(string id) { 
     return "Index " + id; 
    } 

    public string _(string id) { 
     return id; 
    } 
} 

Когда вы говорите двигатель маршрутизации, id не является обязательным для маршрута, он не будет использовать маршрут, если нет id. Это означает, что двигатель будет попадать на маршрут Default для URL-адресов без каких-либо параметров.

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