2014-10-06 6 views
0

В моем проекте MVC4 у ​​меня есть url http://domain.com/ {controller}/{action} /. Для определения посещений пользователей, что страниц и и получить текущее активный Я использую Пункт в меню пути URL-адрес, как этот HttpContext.Request.Url.AbsolutePath.ToLower()Получить маршрут маршрута MVC без параметров URL

Однако в некоторых случаях стезя /{контроллер}/{действие}/{идентификатор} и т.д., которые на самом деле являются /{controller}/{действие} /? {id} = значение.

Как я могу получить /{controller}/{action}/ без параметров, если они переопределены правилами маршрутизации?

спасибо.

ответ

0

Как насчет добавления нового маршрута до вашего текущего маршрута, который будет таким.

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", 
           id = UrlParameter.Optional } 
      ); 

новый маршрут будет выглядеть следующим образом -

routes.MapRoute(
       name: "**Withoutparam**", 
       url: "{controller}/{action}", 
       defaults: new { controller = "Home", action = "Index" } 
      ); 

Пожалуйста, обратите внимание, что вам нужно добавить этот маршрут до вашего текущего маршрута в RouteConfig.cs. Это связано с тем, что MVC начинает поиск маршрутов в файле RouteConfig сверху вниз. Как только он найдет подходящий маршрут, он перестанет искать дальше. Поэтому для вашей проблемы, когда будет маршрут без параметров, он будет выбирать маршрут «Безпарма».

Как я понимаю из вашего комментария ниже. Вам нужен url без id в каждом условии. Если это так, то я думаю, что вы можете сделать это: -

var url = new StringBuilder(); 

string[] partOfUrl = HttpContext.Request.Url.AbsolutePath.ToLower().split('/'); 

for(int count = 0; count< (partOfUrl.Length - 1); count++) 
{ 
    url.Append(partOfLength[count] + "/") 
} 

использование url.ToString() в качестве URL, который вы хотите.

+0

Если вы не активно используют '{контроллер}/{действие}/{ID}' маршрут (т.е. вы передаете 'id' только через строку запроса) вы можете сохранить только маршрут '{controller}/{action}. – Albireo

+0

он также использует id. – Mukund

+1

Да, но если он передаёт это * только * в качестве параметра (он сказал *, который на самом деле «*), ему не нужен маршрут' {controller}/{action}/{id} '. – Albireo

1

Вас интересуют только имена контроллеров и действия?

Если это так, используйте свойство контроллера RouteData.

Вы можете использовать его как это:

public ActionResult Index() 
{ 
    var controller = this.RouteData.Values["controller"]; 
    var action = this.RouteData.Values["action"]; 
} 
+0

не совсем, в некоторых случаях у меня есть/Management/{controller}/{action } в некоторых/{controller}/{action}/{id}, а в некоторых/Management/{controller}/{action}/{id} – DolceVita

+0

@DolceVita тогда вы должны использовать решение Мукунда **, если ** вы используете как '/ {controller}/{action}/{id}' routing, так и '/ {controller}/{action}? {id} = value' one. – Albireo