另一个asp.net路由问题

时间:2013-02-12 09:40:56

标签: asp.net-mvc asp.net-mvc-routing

我四处寻找我的问题,但找不到解决方案......

我有一个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" });

但是第二条路线永远不会匹配。

有什么想法吗?

1 个答案:

答案 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" });

约束是以正则表达式的形式。