1. 程式人生 > >System.Web.Routing入門及進階 下篇

System.Web.Routing入門及進階 下篇

上面介紹的是最簡單的一種定義方式。當然我們可以建立更復雜的規則。其中就包括設定規則的預設值以及設定規則的正則表示式。

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",
                
new Route("{category}/{action}.aspx",
                          
new RouteValueDictionary(
                              
new
                                  {
                                      file 
="Default",
                                      category 
="home",
                                      action 
="index"
                                  }), 
new MyRouteHandler()
                    )
                );

當然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",
                
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 { getset; }
        
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程式程式碼下載: