System.Web.Routing命名空间代码解析(二) Routing类

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;
      }
    }
  }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, return
, this
, public
, values
, httpcontext
Constraints
system.web.routing、system命名空间、解析带命名空间的xml、xml 解析去掉命名空间、数字电影命名解析,以便于您获取更多的相关知识。

时间: 2024-11-03 14:00:56

System.Web.Routing命名空间代码解析(二) Routing类的相关文章

System.Web.Routing命名空间代码解析(四)

Route解析中用到的实体类,一些以"Segment"为名的类 先看类图: 1.PathSegment和PathSubSegment两个类是基类,没有任何代码,分别代表Route规则中Url片段('/'分隔的结果)和Url片段中的子片段('{'和'}'分隔的结果). 2.SeparatorPathSegment类代表Route规则的Url中的'/',也没有任何代码 3.ContentPathSegment类与SeparatorPathSegment类相对应 其有两个属性,Subsegm

System.Web.Routing命名空间代码解析(三) RouteCollection类

RouteCollection类继承于Collection<RouteBase>并且包装了一个Dictionary<string, RouteBase>,于是它提供了二者的功能. 通过察看代码我们可以知道,Collection中和Dictionary中的数据并不完全相同. 1.有Name的Route既存于D中又存于C中,并且可以通过索引属性通过Name检索(参看Add方法) 2.没有Name的Route只存于C中 3.删除Route的时候,如果D中也存在它,则从D中也删除(参看Re

System.Web.Routing命名空间代码解析(一)

RouteBase类,RouteData类,RouteValueDictionary类 1.RouteBase是一个抽象基类,定义了两个功能: 1.从HttpContextBase中根据Route Map规则得到RouteData 2.得到虚拟路径数据(将在 Route 类(下) 中讲解) using System.Security.Permissions; using System.Web; namespace System.Web.Routing { [AspNetHostingPermis

System.Web.Mvc 命名空间

System.Web.Mvc 命名空间包含一些类和接口,它们支持用于创建 Web 应用程序的 ASP.NET 模型视图控制器 (MVC) 框架.该命名空间包含表示控制器.控制器工厂.操作结果.视图.分部视图以及模型联编程序等的类. 类     类 说明 AcceptVerbsAttribute 表示一个特性,该特性指定操作方法将响应的 HTTP 谓词. ActionDescriptor 提供有关操作方法的信息,如操作方法的名称.控制器.参数.特性和筛选器. ActionExecutedConte

代码重构(二):类重构规则

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

在.NET 应用程序中用System.Web.Mail 发送电子邮件

web|程序 在.NET 应用程序中用System.Web.Mail 发送电子邮件 作者:Mark Strawmyer日期:February 9, 2004 -------------------------------------------------------------------------------- 欢迎来到 .NET Nuts & Bolts 栏目.在这个栏目中,我们将探讨怎样在应用中发送电子邮件.这将用到System.Web.Mail 名字空间中的类. 协作数据对象Wind

用System.Web.Mail发送电子邮件

web 作者:Mark Strawmyer 日期:February 9, 2004   欢迎来到 .NET Nuts & Bolts 栏目.在这个栏目中,我们将探讨怎样在应用中发送电子邮件.这将用到System.Web.Mail 名字空间中的类. 协作数据对象Windows 2000 协作数据对象 (CDOSYS) 是微软用来创建和发送基于标准的电子邮件信息的消息组件.它是 用与 Windows NT的协作数据对象(CDONTS) 的替代物. 尽管由于向后兼容的原因 CDONTS 已包含在 Wi

System.Web.Optimization找不到引用

在MVC4的开发中,如果创建的项目为空MVC项目,那么在App_Start目录下没有BundleConfig.cs项的内容,在手动添加时在整个库中都找不到:System.Web.Optimization命名空间.   那么如何找到System.Web.Optimization命名空间,完成BundleConfig.cs内容的添加. 方法如下:打开程序包管理控制台, 如果是多项目,注意默认项目是否为当前项目 在控制台中输入:Install-Package Microsoft.AspNet.Web.

返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)[索引页][源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) 作者:webabcd 介绍 System.Web.Routing - 此命名空间提供用于 URL 路由的类,通过该类可以使用不映射到物理文件的 URL IRouteHandler - 路由处理程序接口,自定义的路由处理程序都要实现这个接口 RequestContext - 封装所请求的路