2015-06-11 2 views
3

Я выполняю этот пост RedirectToAction with parameter сделать этоRedirectToAction с параметром отсутствует действие на URL

return RedirectToAction("index","service",new {groupid = service.GroupID}); 

по какой-то причине, URL возвращает не то, что ожидалось. Например, вместо http://localhost/appname/service/index?groupid=5 он возвращает http://localhost/appname/service?groupid=5. Есть ли способ вернуть ожидаемый URL?

Обновление: RouteConfig.cs

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

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

Благодарности

+0

Покажите свои маршруты из 'RouteConfig.cs' –

+1

Я не могу воспроизвести вашу проблему (отлично работает для меня). Хотя я предлагаю вам изменить параметр вашего метода 'Index()' в 'ServiceController' на' int id', а не 'int groupid', и использовать' return RedirectToAction («index», «service», new {id = service. GroupID}); 'поэтому он генерирует' ../ Service/Index/5', а не '../ Service/Index? Groupid = 5' (или добавить определенный маршрут с помощью' url: "Service/Index/{groupid} ", –

+0

@Ryios: GroupID является целым типом. –

ответ

1

Что происходит, что маршрут по умолчанию определяется как

url: "{controller}/{action}/{id}", 

но метод Index() не имеет параметр с именем id (его groupId), поэтому механизм маршрутизации использует значение по умолчанию для {action}. Вы можете создать маршрут, который Вы хотите, либо изменив имя параметра для id

public ActionResult Index(int id) 

и в другом методе используют

RedirectToAction("Index","Service",new {id = service.GroupID}) 

или добавить новое определение маршрута перед тем маршрут по умолчанию

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

Примечание: в обоих случаях это будет производить ../Service/Index/5, а не ../Service/Index?groupId=5 b ut, как правило, все равно лучше, если вы действительно хотите второй вариант, затем измените маршрут выше на url: "Service/Index", (опустите последний параметр)

1

Хорошо, я понял это и воспроизвел его в тестовой среде. Это из-за маршрутизации.

В MVC, когда вы используете общий улов все маршрут, как вы сделали здесь:

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

Он всегда будет относиться к индексу, как действие по умолчанию отображается в корень контроллера. Таким образом, localhost/somecontroller всегда будет вызывать индекс, а url будет загружать индекс либо в localhost/somecontroller, либо в localhost/somecontroller/index.

Есть 2 способа решения этой проблемы, начиная с самого простого

Решение 1:

На контроллере службы, не называйте ваш метод Index, назовите его что-нибудь еще, как NotIndex, IDoStuff, без разницы. Просто это приведет к перенаправлению перенаправления на Service/IDoStuff (w/e). Однако этот метод означает, что localhost/appname/service создаст 404 (поскольку действие по умолчанию «Индекс» не существует).

Решение 2: Позволяет держать действия с именем Index

  routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapRoute(
      name: "Home", 
      url: "Home/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
     routes.MapRoute(
      name: "Service", 
      url: "Service/Index/{id}", 
      defaults: new { controller = "Service", action = "Index", id = UrlParameter.Optional } 
     ); 

Решение 2 Проблема Определение строгих маршрутов, как это, нарушает ваши умолчанию поймать маршрут все, и если вы принесете поймать по умолчанию все пути назад назад к исходной проблеме, потому что MVC будет проходить через набор маршрутов и применять каждый маршрут к URL-адресу до тех пор, пока не найдет тот, который соответствует, первый соответствует ему, если он не находит подходящего маршрута, а затем bam 404 (Страница не найдена/нет ресурса).

Однако, как вы хотите, я строгий, не URLs недобросовестный, так что я сделал это я Решение 2.

Затем, чтобы получить обратно свой корень URL загрузки Главная -> Индекс Я добавил правила перезаписи в моем веб .config

<system.webServer> 
    <rewrite> 
    <rules> 
     <rule name="RootRedirect" stopProcessing="true"> 
     <match url="^$" /> 
     <action type="Redirect" url="/Home/Index/{R:0}" /> 
     </rule> 
    </rules> 
    </rewrite>  
</system.webServer> 

для того, чтобы работать, вы должны иметь UrlRewrite включенными функциями в IIS (установлен), так что она существует в GAC/машине конфигурации и т.д.

Кроме того, правило перенаправления, как представляется, постоянное правило перенаправления, поэтому браузер будет перенаправлен на него без делая 2 запроса на сервер, как только браузер клиента посетил сайт за один раз до этого.

+0

@ Stephen Muecke получил больше информации с id! = Groupid, я думаю, что оба ответа технически правильны. –

Смежные вопросы