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-StopRoutingHandler Class,经过它处理的URL不会被做任何处理

  通常使用方法如下:

  routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));

  RouteHandler工厂:

  其实IRouteHandler可以实现一个RouteHandler的简单工厂。

  

复制代码 代码如下:

  public class RouteHandlerFactory : IRouteHandler

  {

  string Name { get; set; }

  public RouteHandlerFactory(string name){this.Name = name;}

  #region IRouteHandler 成员

  public IHttpHandler GetHttpHandler(RequestContext requestContext) {

  if (this.Name == "mypage")

  return new MyPage(requestContext);

  if(this.Name="mypage1")

  return new MyPage1(requestContext);

  }

  #endregion

  }

  规定HTTP verbs,这里要使用System.Web.Routing中的HttpMethodConstraint

  

复制代码 代码如下:

  void Application_Start(object sender, EventArgs e) {

  RegisterRoutes(RouteTable.Routes);

  }

  public static void 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程序代码下载:

  WebApplication3.rar