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