System.Web.Routing入门及进阶 下篇


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);
}

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3