我不明白,为什么你不能将它们中的每一个定义为单独的路由,在需要时使用正则表达式。例如区分/blog/year/month/day/title
和/blog/title
。
这些集合中的每一个都是一个单独的案例,您需要告诉 MVC 如何处理每个案例。您可以通过defining the rule once
在Global.asax.cs
文件中执行此操作:
对于第一种情况:/blog/year/month/day/title
routes.MapRoute(
"Blog Full Route", // Route name
"blog/{year}/{month}/{day}/{title}", // URL with parameters
new {controller = "blog", action = "post"}, // Defaults
new {year = @"\d+", month= @"\d+", day = @"\d+"} // Constrain parameters with RegEx patterns
);
对于第二种情况:/blog/title
routes.MapRoute(
"Blog Title Route", // Route name
"blog/{title}", // URL with parameters
new {controller = "blog", action = "post"}, // Defaults
);
对于最后一种情况:/title
routes.MapRoute(
"Title Route", // Route name
"{title}", // URL with parameters
new {controller = "blog", action = "post"}, // Defaults
);
诀窍是把这些路线按照这个确切的顺序排列,最不具体的放在底部。更改顺序会导致使用错误的路线(特别是在最后两条路线中)。如果最后一种情况与第二种情况切换,则该类型的 URLSblog/SomeTitle
将路由到标题为post
动作的操作。blog
每当您为某事创建路线时,请记住以下几点:
- 使用 RegEx 约束路由参数
- 注意
very
路线顺序(哪条路线在哪条之前)
- 波浪形括号
{something}
表示动作参数
一些不错的教程: