2012-01-20 3 views
0

Я правильно понял, что маршруты регулярных выражений были заменены ограничениями маршрута?asp.net mvc regex routes v ограничения

В Интернете нет ничего о маршрутизации через регулярное выражение? кажется, есть некоторые сообщения pre v1, но с тех пор ничего нет, и я достиг той же цели, используя ограничения.

ответ

1

RegEx Маршруты были устарели, и предпочтительный способ справиться с этим - через ограничения маршрута.

Одна из проблем маршрутов RegEx заключалась в том, чтобы использовать URL-адреса Url/Action Links для создания правильного 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 и другой для поиска книг, но я хотел продемонстрировать гибкость, получаемую при использовании регулярных выражений. С приведенным выше маршрутом URL-адреса, такие как «mysite.com/Books/Last+Argument+Of+Kings» и «mysite.com/Books/0575077905», отображаются как на действие «Найти» в классе BookController, с соответствующим инициализированным параметром:

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.aspx извлекается из http://web.archive.org/web/20110227054359/http://www.iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx

Смежные вопросы