2013-07-07 2 views
4

Маршрут:ASP.NET MVC 4 некоторые маршруты не работают

routes.MapRoute(
    "Customer_widget", 
    "customer/widget/{action}/{id}", 
    new { controller = "Customer_Widget", id = UrlParameter.Optional }); 

тест URL1: (делает работу) customer/widget/contact_list/1-1004-SC-0-0-0-0-0-0-Supplier-Supplier----0-0-0-0-Year-Calendar-0-Home-0

тест URL2: (не работает)

customer/widget/contact_list/1-1004-SC-0-0-0-0-0-0-Supplier-Supplier--6%2f1%2f2013-7%2f6%2f2013--0-0-0-0-Year-Calendar-0-Home-0 (does not work) 

У меня есть эти два URL выше. Первый URL-адрес идет в нужное место. Но второй URL просто потерял свой путь ... Я понятия не имею, что вызывает это ... Я вроде бы предполагаю, что дневная часть, 6% 2f1% 2f2013-7% 2f6% 2f2013, вызывает некоторые проблемы, но я не уверен, что это.

CustomerController

public ActionResult Index(string id = null) 
    { 
     string temp = "~/customer/widget/contact_list/" + this.objURL.ToString(); 
     return Redirect("~/customer/widget/contact_list/" + this.objURL.ToString()); 
    } 

Customer_WidgetController

public ActionResult Contact_list(string id = null) 
    { 
     return PartialView("_contact_list",Customer_Widget.Contact_list.Load(id, ref errors)); 
    } 

поток CustomerController -> (по карте маршрута) Customer_WidgetController

ответ

0

Это все из-за закодированной слэш '% 2f' символ, который соответствует «/ ». Из-за этого ваш URL

customer/widget/contact_list/1-1004-SC-0-0-0-0-0-0-Supplier-Supplier--6%2f1%2f2013-7%2f6%2f2013--0-0-0-0-Year-Calendar-0-Home-0 

врываясь в 8 сегментов:

  1. клиента
  2. виджет
  3. contact_list
  4. 1-1004-SC-0-0-0-0-0 -0-Поставщик-поставщик - 6
  5. 2013-7
  6. 2013--0-0-0-0-Year-Календарно-0-Home-0

, но в вашем пути вы ожидаете 4.

Для определения переменной подсчета сегментов вы можете использовать звездочку (*) следующим образом:

routes.MapRoute(
    "Customer_widget", 
    "customer/widget/{action}/{*id}", 
    new { controller = "Customer_Widget", id = UrlParameter.Optional }); 

Система маршрута последовательно проверяет маршруты. Поэтому вам нужно быть осторожным с этим и определить маршрут как это как можно ниже, потому что он может поймать запрос, который вы не хотите поймать с помощью этого маршрута. Например, если следующий маршрут будет определен в вашей системе после указанного выше маршрута, он никогда не будет зацепиться:

routes.MapRoute(
     "Customer_widget", 
     "customer/widget/{action}/{lang}/{*id}", 
     new { controller = "Customer_Widget", lang = "en", id = UrlParameter.Optional } 
     new { lang = "en|es|ru"}); 
Смежные вопросы