URL路由()
ASPNET MVC提供的基于URL模板的路由机制是通过其子类Route实现的如下面的代码片段所示它具有一个代表URL模板的字符串类型的Url属性在实现的GetRouteData方法中我们通过HttpContextBase获取当前请求的URL如果它与URL模板的模式相匹配则创建一个RouteData返回否则返回Null对于返回的RouteData对象其Values属性表示的字典对象包含直接通过地址解析出来的变量而对于DataTokens字典和RouteHandler属性则直接取自Route对象的同名属性
public class Route : RouteBase
{
public IRouteHandler RouteHandler { get; set; }
public string Url { get; set; }
public IDictionary<string object> DataTokens { get; set; }
public Route()
{
thisDataTokens = new Dictionary<string object>()
thisRouteHandler = new MvcRouteHandler()
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
IDictionary<string object> variables;
if (thisMatch(httpContextRequest
AppRelativeCurrentExecutionFilePathSubstring() out variables))
{
RouteData routeData = new RouteData()
foreach (var item in variables)
{
routeDataValuesAdd(itemKey itemValue)
}
foreach (var item in DataTokens)
{
routeDataDataTokensAdd(itemKey itemValue)
}
routeDataRouteHandler = thisRouteHandler;
return routeData;
}
return null;
}
protected bool Match(string requestUrl
out IDictionary<stringobject> variables)
{
variables = new Dictionary<stringobject>()
string[] strArray = requestUrlSplit(/)
string[] strArray = thisUrlSplit(/)
if (strArrayLength != strArrayLength)
{
return false;
}
for (int i = ; i < strArrayLength; i++)
{
if(strArray[i]StartsWith({) && strArray[i]EndsWith(}))
{
variablesAdd(strArray[i]Trim({}ToCharArray())strArray[i])
}
}
return true;
}
}
由于同一个Web应用可以采用多种不同的URL模式所以需要注册多个继承自RouteBase的路由对象多个路由对象组成了一个路由表在我们自定义ASPNET MVC框架中路由表通过类型RouteTable表示如下面的代码片段所示RouteTable仅仅具有一个类型为RouteDictionary的Routes属性表示针对整个Web应用的全局路由表
public class RouteTable
{
public static RouteDictionary Routes { get; private set; }
static RouteTable()
{
Routes = new RouteDictionary()
}
}
RouteDictionary表示一个具名的路由对象的列表我们直接让它继承自泛型的字典类型Dictionary<string RouteBase>其中的Key表示路由对象的注册名称在GetRouteData方法中我们遍历集合找到与指定的HttpContextBase对象匹配的路由对象并得到对应的RouteData
public class RouteDictionary: Dictionary<string RouteBase>
{
public RouteData GetRouteData(HttpContextBase httpContext)
{
foreach (var route in thisValues)
{
RouteData routerouteData = routeGetRouteData(httpContext)
if (null != routeData)
{
return routeData;
}
}
return null;
}
}
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战