2013-02-12 3 views
1

Я искал вокруг моей проблемы, но не смог найти решение ...другой вопрос asp.net маршрутизации

У меня есть BlogController, и я хочу, чтобы соответствовать следующим маршрутам к отдельному действию:

/blog/ 
/blog/rss 
/blog/tags/tagName 

Однако, я хочу, чтобы соответствовать любой другой URL, как:

/blog/my-post 
/blog/other-post 

к действию столба.

Я попытался с

routes.MapRoute("Blog", 
"blog/{action}/{param}", 
new { controller = "Blog", action = "Index", param = UrlParameter.Optional }); 

routes.MapRoute("BlogPost", 
"blog/{slug}", 
new { controller = "Blog", action = "post" }); 

но второй маршрут никогда не совпадают.

Любые идеи?

ответ

2

Первый маршрут allready соответствует любым адресам в форме blog/slug.

Пути разрешения, ASP.NET MVC попытается использовать первое совпадение, и даже если для получения этого метода нет действий. Маршрутизация ASP.NET MVC по-прежнему не будет использовать следующий маршрут.

Таким образом, с вашими маршрутами, адрес blog/my-first-article будет соответствовать первому URL и MVC будет искать метод my-first-action на классе BlogController.

Решение 1

Вы можете либо определить раздельные маршруты для каждого метода, как это:

routes.MapRoute("Blog index", 
    "blog", 
    new { controller = "Blog", action = "Index" }); 

routes.MapRoute("Blog RSS feed", 
    "blog/rss", 
    new { controller = "Blog", action = "Rss" }); 

routes.MapRoute("Posts by tag", 
    "blog/Tags/{params}", 
    new { controller = "Blog", action = "Tags" }); 

routes.MapRoute("BlogPost", 
    "blog/{slug}", 
    new { controller = "Blog", action = "post" }); 

Решение 2

Вы можете использовать ограничение для определения действительных значений {action} в первом маршруте.

routes.MapRoute("Blog", 
    "blog/{action}/{param}", 
    new { controller = "Blog", action = "Index", param = UrlParameter.Optional }, 
    new { action = 'index|rss|tags' }); 

routes.MapRoute("BlogPost", 
    "blog/{slug}", 
    new { controller = "Blog", action = "post" }); 

Ограничение в форме регулярного выражения.

+0

Arjan, спасибо за обновление! Для решения 1 я подумал об этом, но мне не нравилось жестко кодировать каждый маршрут для каждого контроллера. Решение 2, с другой стороны, ТОЧНО, что я имел в виду. Благодаря! – ra00l

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