#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 для этой цели…