前言
在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