2012-01-20 42 views
0

我是否正確思考正則表達式路由已被路由約束取代?asp.net mvc正則表達式路由v約束

在互聯網上沒有什麼關於通過正則表達式的路由?似乎有些帖子在v1之前,但沒有什麼,因爲我已經使用約束達到了相同的目標。

回答

1

RegEx路由已過時,處理此問題的首選方法是通過路由約束。

RegEx路線的挑戰之一是能夠使用Url助手/動作鏈接爲您的網頁生成正確的網址。

我確定您發現的信息是關於MVC Beta的討論。

public class RegexRoute : Route 
{ 
    private readonly Regex _urlRegex; 

    public RegexRoute(string urlPattern, IRouteHandler routeHandler) 
     : this(urlPattern, null, routeHandler) 
    {} 

    public RegexRoute(string urlPattern, RouteValueDictionary defaults, IRouteHandler routeHandler) 
     : base(null, defaults, routeHandler) 
    { 
     _urlRegex = new Regex(urlPattern, RegexOptions.Compiled); 
    } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     string requestUrl = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo; 

     Match match = _urlRegex.Match(requestUrl); 

     RouteData data = null; 

     if(match.Success) 
     { 
      data = new RouteData(this, this.RouteHandler); 

      // add defaults first 
      if (null != this.Defaults) 
      { 
       foreach (KeyValuePair<string, object> def in this.Defaults) 
       { 
        data.Values[def.Key] = def.Value; 
       } 
      } 

      // iterate matching groups 
      for (int i = 1; i < match.Groups.Count; i++) 
      { 
       Group group = match.Groups[i]; 

       if (group.Success) 
       { 
        string key = _urlRegex.GroupNameFromNumber(i); 

        if (!String.IsNullOrEmpty(key) && !Char.IsNumber(key, 0)) // only consider named groups 
        { 
         data.Values[key] = group.Value; 
        } 
       } 
      } 
     } 

     return data; 
    } 
} 

順便提及,具有定義爲正則表達式的路線的一個偉大的「副作用」是,它使我們能夠執行就地驗證,這種呈現不必要約束的概念。

這裏的定義爲正則表達式一個簡單的例子路線:

routes.Add(new RegexRoute(@"^Books/((?<ssn>[\d]{3}(-?)[\d]{2}\1[\d]{4})|(?<query>.+)?)$", new MvcRouteHandler()) 
    { 
     Defaults = new RouteValueDictionary(new { controller = "Book", action = "Find" }) 
    }); 

現在路線以上可以和可能應,被分成兩個不同的路線;一個用於查找SSN的書籍,另一個用於搜索書名,但我想證明使用正則表達式獲得的靈活性。通過上述路線,像「mysite.com/Books/Last+Argument+Of+Kings」和「mysite.com/Books/0575077905」這樣的網址都映射到BookController類的Find操作,並初始化了相應的參數:

public class BookController : Controller 
{ 
    public void Find(string query, int? ssn) 
    { 
     // ... gets the book by ssn if present, otherwise searches using the query 
    } 
} 

從:http://www.iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspxhttp://web.archive.org/web/20110227054359/http://www.iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx

檢索