前言
在System.Web.Routing命名空间中存在着这么一个对象,能够实现传统webform开发下的路由功能:RouteTable,实际上ASP.NET MVC框架也是依赖于此的。本篇就讲讲在传统webform开发中如何实现url rewrite功能(以前要实现这功能,那是相当的…)
入题
下面以新闻查看为sample,比如,原先传统webform开发,大多是如下的url方式:http://xxxx/newsdetail.aspx?newsId=100,如今,通过路由功能,能很方便的实现转换成SEO友好的方式,如:http://xxxx/news/新闻标题, 对于搜索引擎和人类来说可是相当友好了。简单的代码分成如下两步:
进入Global中定义路由
void Application_Start(object sender, EventArgs e) { RouteTable.Routes.MapPageRoute("r1", "news/{uid}", "~/NewsDetail.aspx"); }
在NewsDetail.aspx文件中使用新的路由参数
<head runat="server"> <title><%=NewsTitle%> - Aaron</title> </head> <body> <form id="form1" runat="server"> <div> <strong><%=NewsTitle%></strong> </div> </form> </body>
public partial class NewsDetail : System.Web.UI.Page { public string NewsTitle { get; set; } protected void Page_Load(object sender, EventArgs e) { this.NewsTitle = string.Format("新闻标题 {0}", this.RouteData.Values["uid"]); } }
运行效果如下图:
现在直接访问具体的新闻是可以了,但是如果用户只输入http://localhost:3742/news呢?就报错啦(因为这个url格式不符合路由,因此报404错误):
有2个办法,要么增加一条路由记录,要么为目前这条路由设置默认值,我们来看设置默认值得方式吧:
var defaults = new RouteValueDictionary { { "uid", "默认新闻" } }; RouteTable.Routes.MapPageRoute("r1", "news/{uid}", "~/NewsDetail.aspx", false, defaults);
此时通过这么一Compile,再访问http://localhost:3742/news, 就不会报错了,如下图:
上面说到的路由,除了url外,还有个参数uid,对于NewsDetail.aspx中的代码来说,也就这么一个uid参数,但是,假如我想加入一些固定的参数配置呢?比如:打算做一次email营销,要统计因为email营销而得到的访问量,我们就这样做吧(下面这个做法不专业,只是讲解路由参数的用法):
修改Global代码,给email营销渠道增加相应的路由设置、为新渠道设置固定参数source为"渠道A":
void Application_Start(object sender, EventArgs e) { var defaults = new RouteValueDictionary { { "uid", "默认新闻" } }; RouteTable.Routes.MapPageRoute("r1", "news/{uid}", "~/NewsDetail.aspx", false, defaults); var dataTokens = new RouteValueDictionary { { "source", "渠道A" } }; RouteTable.Routes.MapPageRoute("r2", "newsTuiGuang001/{uid}", "~/NewsDetail.aspx", false, defaults, null, dataTokens); }
修改NewsDetail.aspx.cs,让代码能够处理这个新增的source参数:
public partial class NewsDetail : System.Web.UI.Page { public string NewsTitle { get; set; } protected void Page_Load(object sender, EventArgs e) { this.NewsTitle = string.Format("新闻标题 {0}", this.RouteData.Values["uid"]); if (this.RouteData.DataTokens["source"] != null) { this.NewsTitle += "------来源:推广渠道" + this.RouteData.DataTokens["source"]; } } }
编译,运行:
搞定,哈哈,从代码中得知,固定参数的传递是通过RouteData.DataTokens数组来传递的。
大家要是对路由映射有兴趣,就看看蒋金楠(Artech)的博客吧:http://www.cnblogs.com/artech/archive/2012/03/20/aspnet-routing-02.html