перенаправление asp mvc, добавляющее текущее действие к перенаправлению

#asp.net-mvc #asp.net-mvc-3

#asp.net-mvc #asp.net-mvc-3

Вопрос:

У меня есть контроллер, у которого есть действие под названием RedirectLogin, оно в основном устанавливает переменную TempData для перенаправления обратно, когда вход в систему завершен.

После этого он просто вызывает:

 return RedirectToRoute("Login");
  

Однако, когда оно перенаправляется, оно переходит в /login / RedirectLogin — по какой-то причине оно привязывается к имени вызывающего действия. Я думаю, что это должно просто возвращать значения по умолчанию, а не добавлять действия, особенно действия, не являющиеся частью целевого контроллера.

Если я вызываю:

 return RedirectToRoute("Login", new { action = "Index" });
  

Затем он правильно создает путь / login, но опять же, разве он не должен делать это по умолчанию, без дополнительного бита?

У меня немного нестандартная настройка маршрутизации. По сути, я создаю виртуальные подпапки для своих клиентов, поэтому www.domain.com/clienturl но я все еще хочу www.domain.com/join или www.domain.com/about для перенаправления на неклиентские данные. Я делаю это, добавляя имя контроллера непосредственно в path и добавляя его перед более общим, называемым Landing. Может ли это быть проблемой, или есть лучший способ сделать это 🙂

         // Root paths
        routes.MapRoute("About", "about", new { controller = "Home", action = "About" });
        routes.MapRoute("Info", "info", new { controller = "Home", action = "Info" });
        routes.MapRoute("Privacy", "privacy", new { controller = "Home", action = "Privacy" });
        routes.MapRoute("Terms", "terms", new { controller = "Home", action = "Terms" });

        // Root controllers
        routes.MapRoute("Join", "join/{action}/{id}", new { controller = "join", action = "Index", id = UrlParameter.Optional });
        routes.MapRoute("Login", "login/{action}/{id}", new { controller = "login", action = "Index", id = UrlParameter.Optional });
        routes.MapRoute("Account", "account/{action}/{id}", new { controller = "account", action = "Index", id = UrlParameter.Optional });
        routes.MapRoute("Goodbye", "goodbye/{action}/{id}", new { controller = "goodbye", action = "Index", id = UrlParameter.Optional });

        // Organization
        routes.MapRoute("Landing", "{organization}/{controller}/{action}/{id}", new { controller = "Landing", action = "Index", id = UrlParameter.Optional });

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

Ответ №1:

Это повторное использование данных из текущего запроса. поскольку у вас есть необязательный параметр ‘action’, он принимает параметр action из вашего текущего запроса, действие которого является RedirectLogin, и прикрепляет его к URL. Я бы ввел конкретный маршрут без дополнительных параметров на вашей странице входа или перенаправил на действие и не использовал именованные маршруты. В книге есть страница, посвященная ASP.NET MVC 2, который объясняет, что происходит более подробно.

Ответ №2:

Возможно, вы захотите попробовать следующие альтернативы:

 RedirectToAction(String, String, RouteValueDictionary);
RedirectToAction(String, RouteValueDictionary);
Redirect("~/login"); // Note, this works but if you move around the urls for your routes you'll need to fix it everytime... not recommended
  

В статье MSDN здесь показаны все доступные методы на контроллере:http://msdn.microsoft.com/en-us/library/system.web.mvc.controller_methods(v=VS.98).aspx

Однако не используйте RedirectToActionPermanent или RedirectToRoutePermanent для этой цели…