1

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

我有一个 BlogController,我想将以下路由匹配到一个单独的操作:

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

但是,我想匹配任何其他网址,例如:

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

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

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

有任何想法吗?

4

1 回答 1

2

第一条路由已经匹配任何形式的 url blog/slug

在解析路由时,ASP.NET MVC 将尝试使用第一个匹配项,即使没有任何操作来获取该方法。ASP.NET MVC 的路由仍然不会尝试下一个路由。

因此,对于您的路由,urlblog/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" });

约束采用正则表达式的形式。

于 2013-02-12T12:20:00.470 回答