接觸過 MVC 其中一項很強的功能就是路由,然而已經停止維護的 ASP .NET Web Form 也有類似的路由功能嗎?
最近在維護以 WebForm 的架構所寫的舊的程式碼時,需要做到網頁跳轉
乍聽之下好像以 HttpContext.Current.Response.Redirect 的方式直接就可以做掉了
若是單頁的需求可以這麼做
但這次的難題是不知道有幾頁,卻要針對某個 routing pattern 去做全套性的轉移
來看個例子,以往連的網址是 https://mywebSite/diary
但 diary 底下可能還有一堆日期的網頁,比方說
https://mywebSite/diary/2017/summary
https://mywebSite/diary/20180421
因為系統大改版希望將擁有這些舊的網址的使用者導到新的網站,比方說是
https://myNewSite/blog/2017/summary
會希望這麼最重要的理由應該就是由 google 所記錄的舊網址還可以看到,顧客不會因此找不到網頁就流失掉了
以下就記錄一下這該怎麼做到
首先必須先增加 Global.asax,如果你的 WebForm 專案找不到 asax 的檔案可以加的話
請檢查一下你的 C# launguage level 是否有在 4.0 以上
加入之後再加上 RouteConfig.cs (這邊為主簡單先以一層來看就好)
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("oneLayer", "diary/{layer1}", "~/redirect.aspx"
, true, new RouteValueDictionary { { "layer1", "" } });
}
}
意思是 {domain}/diary 往下的一層路由,都會被你全部導到 root/redirect.aspx 這個頁面去,另外會把layer1 的變數抽出來也夾進去
如果今天是用https://mywebSite/diary/20180421
則會導到 https://mywebSite/redirect.aspx 其中還包含 layer1 = 20180421 的資料
因為這包含了網域的更改,所以我的作法會是先導到另一個網頁,網域的置換則另一個網頁再行處理
剛剛新增的Global.asax 請加上
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
</script>
這樣即可在你的 iis 跑起來時就把這組 routing 註冊進去
最後我們在redirect.aspx 需要做的事就簡單多了
protected void Page_Load(object sender, EventArgs e)
{
string layer = (string)Request.RequestContext.RouteData.Values["layer1"];
string domain = "myNewSite";
string url = "http://" + domain + "/blog/"+layer;
HttpContext.Current.Response.Redirect(url, true);
}
參考資料
https://dotblogs.com.tw/stanley14/2016/05/10/163912
https://msdn.microsoft.com/zh-tw/library/dd329551(v=vs.100).aspx