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