2012-01-24 4 views
0

У меня есть следующие действия в контроллереasp.net MVC и маршрутизации

public ActionResult Index(int? pageNumber) 
public ActionResult Details(string seoFriendlyName) 

И я хочу иметь следующие маршруты:

~/article/ -> Action = Index, pageNumber = 1 
~/article/page-5 -> Action = Index, pageNumber = 5 
~/article/page-1 -> ~/article/ 
~/article/foo -> Action = Details, seoFriendlyName = foo 

Я пытался определить следующие маршруты, но он не работает:

routes.MapRoute(
       null, 
       "article/page-{pageNumber}", 
       new { controller = "MyController", action = "Index", pageNumber = 1 }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article", 
       new { controller = "MyController", action = "Index", }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article/{seoFriendlyName}", 
       new { controller = "MyController", action = "Details", }, 
       new[] { "MyNamespace" } 
); 

Любая помощь была бы принята с благодарностью!

ответ

2

Ваши требования противоречат друг другу. Например, какой маршрут следует выбрать, если у вас есть статья с seoFriendlyName == "page-6" и фактическим номером страницы == 2?

Я предлагаю вам изменить свои требования к

~/article/ -> Action = Index, pageNumber = 1 
~/article/page/5 -> Action = Index, pageNumber = 5 
~/article/page/1 -> ~/article/ 
~/article/foo -> Action = Details, seoFriendlyName = foo 

и тогда вы будете иметь следующие маршруты:

routes.MapRoute(
       null, 
       "article/page/{pageNumber}", 
       new { controller = "MyController", action = "Index", pageNumber = 1 }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article", 
       new { controller = "MyController", action = "Index", }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article/{seoFriendlyName}", 
       new { controller = "MyController", action = "Details", }, 
       new[] { "MyNamespace" } 
); 

UPDATE

В ответ на замечания:

для этого конкретного требования вам необходимо будет изменить маршруты таким образом:

routes.MapRoute(
       null, 
       "article", 
       new { controller = "MyController", action = "Index", pageNumber = 1 }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article/page/{pageNumber}", 
       new { controller = "MyController", action = "Index", }, 
       new[] { "MyNamespace" } 
); 


routes.MapRoute(
       null, 
       "article/{seoFriendlyName}", 
       new { controller = "MyController", action = "Details", }, 
       new[] { "MyNamespace" } 
); 
+0

Если я называю 'Url.Action ("Index", "MyController")', то '~/статьи/page' воздастся вместо' ~/article' –

+0

Если вы хотите, чтобы это было '~/article', вам нужно будет изменить порядок маршрутов. Кроме того, как предположил Ян, вы должны переместить свой параметр pageNumer по умолчанию на другой маршрут. Я обновлю свой ответ в одно мгновение. –

+0

Обновлено ответ –

0

Вы не сказали нам, что точно не работает. Единственное, что я видел, это установить неправильные значения для параметра pageNumber.

Это должно работать лучше:

routes.MapRoute(
    null, 
    "article", 
    new { controller = "MyController", action = "Index", pageNumber = 1 }, 
    new[] { "MyNamespace" } 
); 

routes.MapRoute(
    null, 
    "article/page-{pageNumber}", 
    new { controller = "MyController", action = "Index"}, 
    new[] { "MyNamespace" } 
); 

routes.MapRoute(
    null, 
    "article/{seoFriendlyName}", 
    new { controller = "MyController", action = "Details" }, 
    new[] { "MyNamespace" } 
); 
+0

В вашем примере, если я назову 'Url.Action (« Index »,« MyController », новый {pageNumber = 1})', который будет отображаться как '~/article/page- 1', и я хочу, чтобы это отображалось как '~/article' –

+0

Да, измените порядок первого маршрута. – Jan

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