2013-06-27 222 views
1

是否可以在應用啓動後添加/刪除路由?
我想要做的是讓管理系統中的路由管理功能無需重新啓動Web應用程序。所以內容團隊將根據他們的需求設置路由。ASP.NET路由 - 添加路由

我們使用ASP.NET 4 WebForms應用程序。

回答

2

這是可能的,但你需要編寫自己的邏輯來處理路由收集和更新的基礎上添加/刪除收集。

下面的代碼只是爲了展示如何實現這樣的基礎知識。動態存儲和用戶更新路線有很多種方法。

在Global.asax中假設你有一些預定義的路線:

void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 

     RegisterRoutes(RouteTable.Routes); 

    } 

    void RegisterRoutes(RouteCollection routes) 
    { 
     routes.MapPageRoute("RouteDirect", "about/{user}", "~/about.aspx"); 
    } 

現在About.aspx有辦法讀取路徑值。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Page.RouteData.Values["user"] != null) 
     { 
      TextBox1.Text = Page.RouteData.Values["user"].ToString(); 
     } 
    } 

如果您瀏覽到本地主機:51604 /約/約翰 你會看到約翰文本框。

下面是如何添加/刪除路線的簡單示例。您可以在此邏輯上進行擴展以滿足您的需求,您可以在內容團隊的安全頁面上顯示所有現有路線,併爲他們提供添加/移除/禁用路線的能力,或者具有更復雜的路線參數指定等。

 protected void Button1_Click(object sender, EventArgs e) 
     { 
      //Adding New Route on Button Click 
      RouteTable.Routes.MapPageRoute("RouteDirectNew", "aboutnew/{user}", "~/about.aspx"); 

      //Now route table has 2 routes: 
      // about/{user} 
      // aboutnew/{user} 
     } 

     protected void Button2_Click(object sender, EventArgs e) 
     { 
      //Removing new route on button click 
      RouteCollection rcollection = new RouteCollection(); 
      rcollection = RouteTable.Routes; 

      Route ToDeleteRoute = null; 

      foreach (Route r in rcollection) 
      { 
       if (r.Url == "aboutnew/{user}") 
        ToDeleteRoute = r; 
      } 

      if(ToDeleteRoute != null) 
       RouteTable.Routes.Remove(ToDeleteRoute); 

      //Now route table has only 1 route the original added via global.asax: 
      // about/{user} 

     } 
0

根據MSDN,如果要修改Global.asax.cs的Application_start之外的RouteTable.Routes,需要讀取/寫入鎖以確保其線程安全。

所以上面的Button2_Click應該是這樣的:

protected void Button2_Click(object sender, EventArgs e) 
    { 
     //Removing new route on button click 
     RouteCollection rcollection = new RouteCollection(); 

     using (currentRoutes.GetReadLock()) 
     { 
      rcollection = RouteTable.Routes; 
     } 

     Route ToDeleteRoute = null; 

     foreach (Route r in rcollection) 
     { 
      if (r.Url == "aboutnew/{user}") 
       ToDeleteRoute = r; 
     } 

     if(ToDeleteRoute != null) 
     { 
      using (currentRoutes.GetWriteLock()) 
      { 
       RouteTable.Routes.Remove(ToDeleteRoute); 
      } 
     } 

     //Now route table has only 1 route the original added via global.asax: 
     // about/{user} 

    }