2013-06-27 175 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} 

    }