程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> System.Web.Routing命名空間代碼解析(二) Routing類

System.Web.Routing命名空間代碼解析(二) Routing類

編輯:關於ASP.NET

Route類提供了五個屬性,並且包裝了一個ParsedRoute對象(即已解析過的Route規則),通過察看Route類的構造函數和Url屬性的Set方法,我們可以知道的是:Route規則是在添加的時候就解析的,即,在Route類事例化的時候設置Url屬性的時候就生成了ParsedRoute對象。

其他的四個屬性分別是 :默認值,約束規則,自帶數據,處理Handler.

可以把Router類對比和RouterData類作對比。。。。

Route類的四個方法我將會在 Routing類(下)中介紹。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using System.Web;
  
namespace System.Web.Routing
{
  public enum RouteDirection
  {
    IncomingRequest,
    UrlGeneration
  }
  
  [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal),
   AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  public class Route : RouteBase
  {
    // Fields
    private ParsedRoute _parsedRoute;
    private string _url;
    private const string HttpMethodParameterName = "httpMethod";
  
    Constructions#region Constructions
  
    public Route(string url, IRouteHandler routeHandler)
    {
      this.Url = url;
      this.RouteHandler = routeHandler;
    }
  
    public Route(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
    {
      this.Url = url;
      this.Defaults = defaults;
      this.RouteHandler = routeHandler;
    }
  
    public Route(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
           IRouteHandler routeHandler)
    {
      this.Url = url;
      this.Defaults = defaults;
      this.Constraints = constraints;
      this.RouteHandler = routeHandler;
    }
  
    public Route(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
           RouteValueDictionary dataTokens, IRouteHandler routeHandler)
    {
      this.Url = url;
      this.Defaults = defaults;
      this.Constraints = constraints;
      this.DataTokens = dataTokens;
      this.RouteHandler = routeHandler;
    }
  
    #endregion
  
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
      string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) +
                 httpContext.Request.PathInfo;
      RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults);
      if (values == null)
        return null;
      RouteData data = new RouteData(this, this.RouteHandler);
      if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest))
        return null;
      foreach (KeyValuePair<string, object> pair in values)
        data.Values.Add(pair.Key, pair.Value);
      if (this.DataTokens != null)
        foreach (KeyValuePair<string, object> pair2 in this.DataTokens)
          data.DataTokens[pair2.Key] = pair2.Value;
      return data;
    }
  
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
      BoundUrl url = this._parsedRoute.Bind(requestContext.RouteData.Values, values, this.Defaults,
                         this.Constraints);
      if (url == null)
        return null;
      if (!this.ProcessConstraints(requestContext.HttpContext, url.Values, RouteDirection.UrlGeneration))
        return null;
      VirtualPathData data = new VirtualPathData(this, url.Url);
      if (this.DataTokens != null)
        foreach (KeyValuePair<string, object> pair in this.DataTokens)
          data.DataTokens[pair.Key] = pair.Value;
      return data;
    }
  
    protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName,
                         RouteValueDictionary values, RouteDirection routeDirection)
    {
      object obj2;
      IRouteConstraint constraint2 = constraint as IRouteConstraint;
      if (constraint2 != null)
        return constraint2.Match(httpContext, this, parameterName, values, routeDirection);
      string str = constraint as string;
      if (str == null)
        throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture,
                                 RoutingResources.
                                   Route_ValidationMustBeStringOrCustomConstraint,
                                 new object[] {parameterName, this.Url}));
      values.TryGetValue(parameterName, out obj2);
      string input = Convert.ToString(obj2, CultureInfo.InvariantCulture);
      string pattern = "^(" + str + ")$";
      return Regex.IsMatch(input, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
    }
  
    private bool ProcessConstraints(HttpContextBase httpContext, RouteValueDictionary values,
                    RouteDirection routeDirection)
    {
      if (this.Constraints != null)
        foreach (KeyValuePair<string, object> pair in this.Constraints)
          if (!this.ProcessConstraint(httpContext, pair.Value, pair.Key, values, routeDirection))
            return false;
      return true;
    }
  
    // Properties
    public RouteValueDictionary Constraints { get; set; }
  
    public RouteValueDictionary DataTokens { get; set; }
  
    public RouteValueDictionary Defaults { get; set; }
  
    public IRouteHandler RouteHandler { get; set; }
  
    public string Url
    {
      get { return (this._url ?? string.Empty); }
      set
      {
        this._parsedRoute = RouteParser.Parse(value);
        this._url = value;
      }
    }
  }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved