System.Web.Routing入門及進階 下篇
阿新 • • 發佈:2018-12-27
上面介紹的是最簡單的一種定義方式。當然我們可以建立更復雜的規則。其中就包括設定規則的預設值以及設定規則的正則表示式。
UrlRouting高階應用
預計效果:
category:a
action:b
亦如果我訪問/chsword/xxxx.aspx就會轉到Default.aspx?category=chsword&action=xxxx就會顯示
category:chsword
action:xxxx
如果訪問/chsword/就會轉到 Default.aspx?category
category:chsword
action:index
首先我建立一個Route
routes.Add("Default",
new Route("{category}/{action}.aspx",
new RouteValueDictionary(
new
{
file
category ="home",
action ="index"
}), new MyRouteHandler()
)
);
當然IHttpHandler的處理方式也要有所改變
為了方便檢視我使用了下方法:
context.Server.Execute(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",
new Route("{category}/{action}.chs",
new RouteValueDictionary(
new {
file ="Default",
category ="home",
action ="1"
}),
new RouteValueDictionary(
new {
action ="[\\d]+"
}),
new MyRouteHandler()
)
);
以上程式碼規定了action只能是數字則訪問/a/1.chs可以正常訪問。
而訪問/a/b.chs則會顯示未找到資源。
當然這是裡可以使用更高階的正則表示式。
UrlRouting的技巧
排除UrlRouting的方法:
System.Web.Routing預設提供了一個IRouteHandler-,經過它處理的URL不會被做任何處理
通常使用方法如下:
routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));
RouteHandler工廠:
其實IRouteHandler可以實現一個RouteHandler的簡單工廠。
publicclass RouteHandlerFactory : IRouteHandler{
string Name { get; set; }
public RouteHandlerFactory(string name){this.Name = name;}
#region IRouteHandler 成員public IHttpHandler GetHttpHandler(RequestContext requestContext) {
if (this.Name =="mypage")
returnnew MyPage(requestContext);
if(this.Name="mypage1")
returnnew MyPage1(requestContext);
}
#endregion
}
規定HTTP verbs,這裡要使用System.Web.Routing中的HttpMethodConstraint
void Application_Start(object sender, EventArgs e) {RegisterRoutes(RouteTable.Routes);
}
publicstaticvoid RegisterRoutes(RouteCollection routes){
string[] allowedMethods = { "GET", "POST" };
HttpMethodConstraint methodConstraints =new HttpMethodConstraint(allowedMethods);
Route reportRoute =new Route("{locale}/{year}", new ReportRouteHandler());
reportRoute.Constraints =new RouteValueDictionary { { "httpMethod", methodConstraints } };
routes.Add(reportRoute);
}
Demo程式程式碼下載: