RouteBase是一个抽象类,在ASP.NET路由系统的应用编程接口中,Route类型是其唯一的直接继承者,在默认的情况下调用RouteCollection的MapPageRoute方法在路由表中添加的就是这么一个对象。如下面的代码片段所示,Route类型具有一个字符串类型的属性Url,它代表绑定在路由对象上的路由模板。
public class Route : RouteBase { public Route(string url,IRouteHandler routeHandler); public Route(string url,RouteValueDictionary defaults,IRouteHandler routeHandler); public Route(string url,RouteValueDictionary defaults,RouteValueDictionary constraints, IRouteHandler routeHandler); public Route(string url,RouteValueDictionary defaults,RouteValueDictionary constraints, RouteValueDictionary dataTokens,IRouteHandler routeHandler); public override RouteData GetRouteData(HttpContextBase httpContext); public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values); protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName,RouteValueDictionary values,RouteDirection routeDirection); public RouteValueDictionary Constraints { set; get; } public RouteValueDictionary Defaults { set; get; } public RouteValueDictionary DataTokens { set; get; } public IRouteHandler RouteHandler { set; get; } public string Url { set; get; } }
/weather/{areacode}/{days}
对于上述这个路由模板来说,我们通过分隔符“/”对其进行拆分得到3个基本的字符串,它们被称为“段”。对于组成某个段的内容,又可以分为“变量”和“字面值”,前者通过采用花括号(“{}”)对变量名的包装来表示(比如表示电话区号的“{areacode}”和天数的“{days}”),后者则代表单纯的静态文字(比如“weather”)。值得一提的是,路由解析过程中针对字符的比较是不区分大小写的,因为URL本来就不区分大小写。
对于一个具体的URL来说,匹配成功需要有两个基本条件,即该URL包含的段的数量和URL模板相同,对应的文本段内容也一致。按照这个匹配规则,下面这个URL和我们上面定义的路由模板是相匹配的。
/weather/0512/2
除了用于表示路由模板的核心属性Url之外,Route类型还具有一些额外的属性。属性Constrations为定义在模板中的变量以正则表达式的形式设定一些约束条件,该属性类型为RouteValueDictionary,其中Key和Value分别表示变量名和作为约束的正则表达式。比如对于上面定义的这个Url模板来说,我们可以为这两个变量指定相应的正则表达式使请求地址具有合法的区号和作为整数的未来天数。如果我们通过该属性为Route对象定义了基于某些变量的正则表达式,匹配成功的先决条件除了上述两个外,被验证的URL中对应的段还必须通过对应正则表达式的验证。除了采用正则表达式来定义约束之外,还可以直接创建一个RouteConstraint对象来表示约束。
Route类型的另一个属性Defaults同样返回一个RouteValueDictionary对象,他保存了为路由变量定义的默认值。值得一提的是,具有默认值的路由变量不一定要出现在路由模板中。当某个Route对象针对某个URL实施路由解析的时候,如果URL只能匹配路由模板前面的部分,但是后边部分均为变量并且具有对应的默认值,这种情况下依然被视为匹配成功。
还是以前面给出的路由模板为例,如果我们将“{areacode}”和“{days}”这两个变量的默认值分别设置为“010(北京)”和“2”(未来两天)如下所示的3个URL都能和拥有此路由模板的Route对象匹配成功,并且他们可以被视为等效的URL。
/weather/010/2
/weather/010
/weather
关于定义在路由模板中的变量,我们并不要求它作为整个段的内容。换句话说,一个段可以同时包含静态文字和变量。除此之外,我们还可以采用“{*<<variable>>}”的形式来定义匹配URL的最后部分(可以包含多个段)的变量,姑且称之为“通配变量”。
/{filename}.{extension}/{*pathinfo}
对于如上的这个路由模板来说,第一个段中包含两部分内容,即表示文件名称和扩展名的变量“{filename}”和“{extension}”,以及作为两者分隔符的字面量“.”后边紧跟一个通配符变量{*pathinfo}。这个路由模板与下面一个URL是可以成功匹配的,匹配后定义在模板中的3个变量({filename}、{extension}和{pathinfo})的值分别为“default”、“aspx”和“abc/123”。
/default.aspx/abc/123
Route类型的DataTokens属性在之前已经有所提及,它用于存储一些额外路由变量,这些变量不会参与针对请求的路由解析。对于调用Route类型的GetRouteData和GetVirtualPath方法分别得到的RouteData和VirtualPathData对象来说,他们的DataTokens属性所包含的路由变量都来源于此。
学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(六)
原文地址:http://blog.csdn.net/yejinwei1220/article/details/45949871