问题出在您的模式上:News/{id}-{alias}
因为路由正在贪婪地解析模式。
因此 urlhttp://localhost:54010/News/6-news
生成以下标记:
id = 6, alias = news
但是会http://localhost:54010/News/6-nice-news
生成以下标记:
id = 6-nice, alias = news
并且id = 6-nice
令牌将使您的路由约束失效@"^[0-9]+$".
,因此您将获得 404。
现在有一种方法可以配置 MVC 的这种行为,因此您有以下选项:
- 使用破折号以外的东西。正如您所指出的,将破折号和连字符结合使用是可行的。
- 采用 flem 方法并在控制器操作中解析 id 和 alias
- 您可以创建一个
Route
将进行重新解析的自定义。例如转换 id = 6-nice, alias = news
为id = 6, alias = news-nice
我将向您展示选项 3 的原始(没有任何错误处理或良好的编码实践!)实现,以帮助您入门。
所以你需要继承自Route
:
public class MyRoute : Route
{
public MyRoute(string url,
RouteValueDictionary defaults,
RouteValueDictionary constraints,
RouteValueDictionary dataTokens)
: base(url, defaults, constraints, dataTokens, new MvcRouteHandler())
{
}
protected override bool ProcessConstraint(HttpContextBase httpContext,
object constraint, string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
var parts = ((string) values["id"]).Split('-');
if (parts.Length > 1)
{
values["id"] = parts[0];
values["alias"] = // build up the alias part
string.Join("-", parts.Skip(1)) + "-" + values["alias"];
}
var processConstraint = base.ProcessConstraint(httpContext, constraint,
parameterName, values, routeDirection);
return processConstraint;
}
}
然后你只需要注册你的路线:
routes.Add("News",
new MyRoute("News/{id}-{alias}",
new RouteValueDictionary(new {controller = "News", action = "Show"}),
new RouteValueDictionary(new
{
id = @"^[0-9]+$"
}),
new RouteValueDictionary()));