java 路由框架 ASP.NET MVC 4框架揭秘:URL路由(2)
ASP.NET MVC 4框架揭秘:URL路由(2)
URL路由( )
ASP NET 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()
{
this DataTokens = new Dictionary<string object>()
this RouteHandler = new MvcRouteHandler()
}
public override RouteData GetRouteData(HttpContextBase Context)
{
IDictionary<string object> variables;
if (this Match(Context Request
AppRelativeCurrentExecutionFilePath Substring( ) out variables))
{
RouteData routeData = new RouteData()
foreach (var item in variables)
{
routeData Values Add(item Key item Value)
}
foreach (var item in DataTokens)
{
routeData DataTokens Add(item Key item Value)
}
routeData RouteHandler = this RouteHandler;
return routeData;
}
return null;
}
protected bool Match(string requestUrl
out IDictionary<string object> variables)
{
variables = new Dictionary<string object>()
string[] strArray = requestUrl Split( / )
string[] strArray = this Url Split( / )
if (strArray Length != strArray Length)
{
return false;
}
for (int i = ; i < strArray Length; i++)
{
if(strArray [i] StartsWith( { ) && strArray [i] EndsWith( } ))
{
variables Add(strArray [i] Trim( {} ToCharArray()) strArray [i])
}
}
return true;
}
}
由于同一个Web应用可以采用多种不同的URL模式 所以需要注册多个继承自RouteBase的路由对象 多个路由对象组成了一个路由表 在我们自定义ASP NET 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 Context)

{
foreach (var route in this Values)
{
RouteData routerouteData = route GetRouteData(Context)
if (null != routeData)
{
return routeData;
}
}
return null;
}
}
返回目录ASP NET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化 让你的Java程序更快 更稳定
lishixinzhi/Article/program/net/201311/16111