WebForm Routing

接觸過 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