問題是與你的模式:News/{id}-{alias}
因爲定線制是貪婪地解析模式。
所以URL http://localhost:54010/News/6-news
生成以下標記:
id = 6, alias = news
但http://localhost:54010/News/6-nice-news
生成以下標記:
id = 6-nice, alias = news
而且id = 6-nice
令牌就會失敗你的路由contraint @"^[0-9]+$".
所以你會得到404
現在有辦法配置MVC的這種行爲,所以y你有以下選擇:
- 使用別的不是破折號。正如您所注意的,將短劃線和連字符組合起來。
- 採取弗洛姆的辦法,並解析你的控制器內部的ID和別名動作
- 你可以創建一個自定義
Route
這將採取重新解析。 E.g轉化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()));
+1定製路線 - 好的技巧 –