是否可以在應用啓動後添加/刪除路由?
我想要做的是讓管理系統中的路由管理功能無需重新啓動Web應用程序。所以內容團隊將根據他們的需求設置路由。ASP.NET路由 - 添加路由
我們使用ASP.NET 4 WebForms應用程序。
是否可以在應用啓動後添加/刪除路由?
我想要做的是讓管理系統中的路由管理功能無需重新啓動Web應用程序。所以內容團隊將根據他們的需求設置路由。ASP.NET路由 - 添加路由
我們使用ASP.NET 4 WebForms應用程序。
這是可能的,但你需要編寫自己的邏輯來處理路由收集和更新的基礎上添加/刪除收集。
下面的代碼只是爲了展示如何實現這樣的基礎知識。動態存儲和用戶更新路線有很多種方法。
在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}
}
根據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}
}