我四处寻找我的问题,但找不到解决方案......
我有一个BlogController,我希望将以下路由与单独的操作匹配:
/blog/
/blog/rss
/blog/tags/tagName
但是,我想匹配任何其他网址,例如:
/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" });
但是第二条路线永远不会匹配。
有什么想法吗?
答案 0 :(得分:2)
第一条路线已经与blog/slug
形式的任何网址匹配。
在解析路由时,ASP.NET MVC会尝试使用第一个匹配,即使没有动作来获取该方法。 ASP.NET MVC的路由仍然不会尝试下一个路由。
因此,对于您的路线,网址blog/my-first-article
将匹配第一个网址,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" });
约束是以正则表达式的形式。