2013-06-27 5 views
1

Можно ли добавлять/удалять маршруты после запуска приложения?
Что я хочу сделать, это дать возможность управлять маршрутами в системе администратора без необходимости перезапуска веб-приложения. Таким образом, команда контента настроит маршрутизацию по их потребностям.Маршрутизация 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, если вы хотите изменить RouteTable.Routes за пределами Application_start из Global.asax.cs, вам нужно получить блокировку чтения/записи, чтобы убедиться, что ее поток безопасен.

Так выше 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} 

    }