WebForm开发中的路由功能
WebForm开发中的路由功能
前言
在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
自省推动进步,视野决定未来。
分类: ASP.NET MVC
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息