2016-08-17 3 views
0

У меня есть следующие действияMVC RedirectToAction не скрывающие параметры

public ActionResult TemplateBuilder(int id, int? processId) { } 

А потом у меня есть следующие

@Url.Action("TemplateBuilder","InspectionTemplate")/id/processId 

URL, то выглядит следующим образом: InspectionTemplate/TemplateBuilder/1/2

Но если я использую

return RedirectToAction("TemplateBuilder","InspectionTemplate", new { id=1, processId = 2}); 

Затем я получаю следующий результат: InspectionTemplate/TemplateBuilder/1?processId=2

Как это исправить.

Вот мой Routing

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 


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

     routes.MapRoute(
      name: "ProcessRoute", 
      url: "{controller}/{action}/{id}/{processId}", 
      defaults: new 
      { 
       controller = "InspectionTemplate", 
       action = "TemplateBuilder", 
       id = UrlParameter.Optional, 
       processId = UrlParameter.Optional 
      } 
     ); 

     routes.MapRoute(
      name: "DateRoute", 
      url: "{controller}/{action}/{year}/{month}/{day}", 
      defaults: new 
      { 
       controller = "Inspection", 
       action = "Assign", 
       year = UrlParameter.Optional, 
       month = UrlParameter.Optional, 
       day = UrlParameter.Optional 
      } 
     ); 


    } 
+2

Удалить 'ID = UrlParameter.Optional,' 'из ProcessRoute' (только последний параметр может быть необязательным) и изменить его на' URL: «InspectionTemplate/{ action}/{id}/{processId} ",' поэтому его специфический и перенести его на первый маршрут (порядок важен) –

+0

Это не сработало :( –

+0

Nevermind, он работал, забыл переместить его на верх. Добавьте в качестве ответа, чтобы я мог принять его –

ответ

1

У вас есть 3 проблемы с определениями маршрутов

  1. только последний параметр в определении маршрута может быть помечен UrlParameter.Optional. Если вы должны были предоставить только один, то механизм маршрутизации не знает, какой параметр должен быть связан , поэтому значения (-ы) будут добавлены в качестве параметров строки запроса).
  2. Основной вопрос, однако, это порядок маршрутов. Маршрутизаторы
    ищут определения в том порядке, в котором они объявлены, а останавливается, как только он находит соответствующий, а в вашем случае
    IDRoute будет соответствовать таким образом, что маршруты должны быть заменены.
  3. Это само по себе может вызвать проблемы с другими определениями маршрутов, поэтому лучше всего сделать ваш маршрут однозначно идентифицируемым, например, , указав имя контроллера в определении маршрута.

Ваши определения должны быть

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "ProcessRoute", 
     url: "InspectionTemplate/{action}/{id}/{processId}", 
     defaults: new { controller = "InspectionTemplate", action = "TemplateBuilder", processId = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     name: "DateRoute", 
     url: "Inspection/{action}/{year}/{month}/{day}", 
     defaults: new { controller = "Inspection", action = "Assign", } // assumes all parameters are required 
    ); 

    // The default will only be match if the url does not start with '/InspectionTemplate/' or '/Inspection/' 
    routes.MapRoute(
     name: "IDRoute", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
Смежные вопросы