Demo程序代码下载:http://file.ddvip.com/2008_10/1225161566_ddvip_3539.rar
上面介绍的是最简单的一种定义方式。当然我们可以建立更复杂的规则。其中就包括设定规则的默认值以及设定规则的正则表达式。
UrlRouting高级应用
预计效果:
当我访问/a/b.aspx时就会转到Default.aspx?category=a&action=b在页面上显示
category:a
action:b
亦如果我访问/chsword/xxxx.aspx就会转到Default.aspx?category=chsword&action=xxxx就会显示
category:chsword
action:xxxx
如果访问/chsword/就会转到 Default.aspx?category=chsword&action=index就会显示
category:chsword
action:index
首先我建立一个Route
routes.Add(
"Default",
newRoute("{category}/{action}.aspx",
newRouteValueDictionary(
new
{
file="Default",
category="home",
action="index"
}),newMyRouteHandler()
)
);
当然IHttpHandler的处理方式也要有所改变
为了方便查看我使用了下方法
context.Server.Execute(string.Format("/{0}.aspx?category={1}&action={2}",
RequestContext.RouteData.Values.ContainsKey("file")
?RequestContext.RouteData.Values["file"].ToString()
:"default",
RequestContext.RouteData.Values.ContainsKey("category")
?RequestContext.RouteData.Values["category"].ToString()
:"",
RequestContext.RouteData.Values.ContainsKey("action")
?RequestContext.RouteData.Values["action"].ToString()
:"")
);
即/a/b.aspx是映射到Default.aspx?category=a&action=b
在Default.aspx中写如下代码:
category:<%=Request.Params["category"]%><br/>
action:<%=Request.Params["action"]%>
以显示传入的参数。
如果在IIS中设置Index.aspx时就算输入/a/也会访问到/a/index.aspx,即默认的会按RouteValueDictionary中设置的值自动补全
UrlRouting使用正则表达式规则
UrlRouting在定义的时候也可以按正则的规则来进行定义。
routes.Add(
"zz",
newRoute("{category}/{action}.chs",
newRouteValueDictionary(
new{
file="Default",
category="home",
action="1"
}),
newRouteValueDictionary(
new{
action="[d]+"
}),
newMyRouteHandler()
)
);
以上代码规定了action只能是数字则访问/a/1.chs可以正常访问。
而访问/a/b.chs则会显示未找到资源。
当然这是里可以使用更高级的正则表达式。
UrlRouting的技巧排除UrlRouting的方法:
System.Web.Routing默认提供了一个IRouteHandler-StopRoutingHandler Class,经过它处理的URL不会被做任何处理
通常使用方法如下:
routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));
RouteHandler工厂:
其实IRouteHandler可以实现一个RouteHandler的简单工厂。
publicclassRouteHandlerFactory:IRouteHandler
{
stringName{get;set;}
publicRouteHandlerFactory(stringname){this.Name=name;}
#regionIRouteHandler成员
publicIHttpHandlerGetHttpHandler(RequestContextrequestContext){
if(this.Name=="mypage")
returnnewMyPage(requestContext);
if(this.Name="mypage1")
returnnewMyPage1(requestContext);
}
#endregion
}
规定HTTP verbs,这里要使用System.Web.Routing中的HttpMethodConstraint
voidApplication_Start(objectsender,EventArgse) {
RegisterRoutes(RouteTable.Routes);
}
publicstaticvoidRegisterRoutes(RouteCollectionroutes){
string[]allowedMethods={"GET","POST"};
HttpMethodConstraintmethodConstraints=newHttpMethodConstraint(allowedMethods);
RoutereportRoute=newRoute("{locale}/{year}",newReportRouteHandler());
reportRoute.Constraints=newRouteValueDictionary{{"httpMethod",methodConstraints}};
routes.Add(reportRoute);
}