zoukankan      html  css  js  c++  java
  • RegexRouter

    public class RegexRoute : Route
        {
            
    #region Private Fields

            
    private readonly Regex _urlRegex;

            
    #endregion

            
    #region Constructors

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

            }

            
    public RegexRoute(Regex urlPattern, RouteValueDictionary defaults, IRouteHandler routeHandler)
                : 
    base(null, defaults, routeHandler)
            {
                _urlRegex 
    = urlPattern;
            }

            
    #endregion

            
    #region Public Overrides Methods
            
    public override RouteData GetRouteData(HttpContextBase httpContext)
            {
                var requestUrl 
    = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2+ httpContext.Request.PathInfo;
                
                var match 
    = _urlRegex.Match(requestUrl);

                RouteData data 
    = null;

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

                    
    // add defaults first
                    if (null != Defaults)
                    {
                        
    foreach (var def in Defaults)
                        {
                            data.Values[def.Key] 
    = def.Value;
                        }
                    }

                    
    if (Constraints != null)
                    {
                        Dictionary
    <stringstring> constraintDict = new Dictionary<string,string>();
                        (Constraints 
    as ICollection<KeyValuePair<stringobject>>).ToList().ForEach(
                            c 
    => {
                                constraintDict.Add(c.Key,c.Value.ToString());
                            });

                        
    // iterate matching groups
                        if (constraintDict != null && constraintDict.Count > 0)
                        {
                            
    for (var i = 1; i < match.Groups.Count; i++)
                            {
                                var group 
    = match.Groups[i];

                                
    if (!group.Success) continue;

                                
    foreach (var _cregex in constraintDict)
                                {
                                    
    if (Regex.IsMatch(group.Value, _cregex.Value))
                                    {
                                        data.Values[_cregex.Key] 
    = group.Value;
                                        constraintDict.Remove(_cregex.Key);
                                        
    if (constraintDict.Count == 0)
                                            
    break;
                                        
    else
                                            
    continue;
                                    }
                                }
                                
                            }
                        }                    
                    }
                }

                
    return data;
            }

            
    #endregion
        }

        
    public static class RegexRouteCollectionExtensions
        {
            
    public static Route MapRoute(this RouteCollection routes, string name, Regex urlPattern)
            {
                
    return routes.MapRoute(name, urlPattern, nullnull);
            }
            
    public static Route MapRoute(this RouteCollection routes, string name, Regex urlPattern, object defaults)
            {
                
    return routes.MapRoute(name, urlPattern, defaults, null);
            }
            
    public static Route MapRoute(this RouteCollection routes, string name, Regex urlPattern, string[] namespaces)
            {
                
    return routes.MapRoute(name, urlPattern, nullnull, namespaces);
            }
            
    public static Route MapRoute(this RouteCollection routes, string name, Regex urlPattern, object defaults, object constraints)
            {
                
    return routes.MapRoute(name, urlPattern, defaults, constraints, null);
            }
            
    public static Route MapRoute(this RouteCollection routes, string name, Regex urlPattern, object defaults, string[] namespaces)
            {
                
    return routes.MapRoute(name, urlPattern, defaults, null, namespaces);
            }
            
    public static Route MapRoute(this RouteCollection routes, string name, Regex urlPattern, object defaults, object constraints, string[] namespaces)
            {
                
    if (routes == null)
                {
                    
    throw new ArgumentNullException("routes");
                }
                
    if (urlPattern == null)
                {
                    
    throw new ArgumentNullException("urlPattern");
                }
                var route2 
    = new RegexRoute(urlPattern, new MvcRouteHandler())
                {
                    Defaults 
    = new RouteValueDictionary(defaults),
                    Constraints 
    = new RouteValueDictionary(constraints)
                };
                var item 
    = route2;
                
    if ((namespaces != null&& (namespaces.Length > 0))
                {
                    item.DataTokens 
    = new RouteValueDictionary();
                    item.DataTokens[
    "Namespaces"= namespaces;
                }
                routes.Add(name, item);
                
    return item;
            }
        }
  • 相关阅读:
    【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game
    【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
    【线段树】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem J. Jedi Training
    【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word
    【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem H. Path or Coloring
    【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes
    【找规律】【递归】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem F. Doubling
    【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
    【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
  • 原文地址:https://www.cnblogs.com/apexchu/p/1899599.html
Copyright © 2011-2022 走看看