【问题标题】:ASP.NET Routing - Add RoutesASP.NET 路由 - 添加路由
【发布时间】:2013-06-27 20:57:29
【问题描述】:

是否可以在应用程序启动后添加/删除路由?
我想要做的是提供在管理系统中管理路由的能力,而无需重新启动 Web 应用程序。所以内容团队会根据自己的需要设置路由。

我们使用 ASP.NET 4 WebForms 应用程序。

【问题讨论】:

    标签: asp.net routing webforms


    【解决方案1】:

    这是可能的,但您需要编写自己的逻辑来处理路由收集和基于添加/删除到集合的更新。

    下面的代码只是为了展示如何实现此类目标的基础知识。有很多方法可以动态存储和让用户更新路由。

    在 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();
            }
        }
    

    如果您浏览到 localhost:51604/about/john 您将在文本框中看到 john。

    以下是有关如何添加/删除路线的简单示例。您可以扩展此逻辑以满足您的需求,您可以在安全页面上为您的内容团队显示所有现有路由,并为他们提供添加/删除/禁用路由或使用更复杂的方式来指定路由参数等的能力。

            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}
    
            }
    

    【讨论】:

      【解决方案2】:

      根据MSDN,如果你想在Global.asax.cs的Application_start之外修改RouteTable.Routes,你需要获取Read/Write lock来保证它的线程安全。

      所以上面的 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}
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多