4

我有這樣的路線:破折號路線值

  routes.MapRoute(
      "News", 
      "News/{id}-{alias}", 
      new { controller = "News", action = "Show" }, 
      new 
       { 
        id = @"^[0-9]+$" 
       }, 
      namespaces: new[] { "Site.Controllers" } 
     ); 

這條路線工作的URL是這樣的:

http://localhost:54010/News/6-news 

但不工作的網址是這樣的:

http://localhost:54010/News/6-nice-news 

如何在我的路由值「別名」中使用破折號?

EDITED

路線是這樣的:

"News/{id}_{alias}" 

同時適用於網址:

http://localhost:54010/News/6_news 
http://localhost:54010/News/6_nice-news 

回答

3

問題是與你的模式: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你有以下選擇:

  1. 使用別的不是破折號。正如您所注意的,將短劃線和連字符組合起來。
  2. 採取弗洛姆的辦法,並解析你的控制器內部的ID和別名動作
  3. 你可以創建一個自定義Route這將採取重新解析。 E.g轉化id = 6-nice, alias = newsid = 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())); 
+0

+1定製路線 - 好的技巧 –