ASP.NET MVC: Каков правильный способ перенаправления на страницы/действия в MVC?
Я новичок в MVC, но не уверен, какой именно Redirect... заменяет стандартный перенаправление, используемый в WebForms, то есть стандартный Response.Redirect()
Например, мне нужно перенаправить на другие страницы в нескольких сценариях:
1) Когда пользователь выходит из системы (выдает форму в действии) Я хочу перенаправить на страницу входа.
2) В контрольном или базовом событии контроллера, например Initialize
, я хочу перенаправить на другую страницу (AbsoluteRootUrl + Controller + Action)
Кажется, что в некоторых случаях вызываются несколько перенаправлений, которые вызывают ошибки, что-то связано с тем фактом, что страница уже перенаправляется? Как отменить текущий запрос и просто перенаправить?
Update:
Ответ на этот вопрос (System.Web.Mvc.Controller Initialize) означает, что Initialize
не следует использовать и OnActionExecuting
следует использовать?
Любые комментарии о том, почему Initialize
не следует использовать или почему OnAuthorization
не лучший вариант?
Дополнительная информация:
Это сообщение в блоге (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) указывает, что OnActionExecuting
полезен для аутентификации (как указано в ссылке выше). Я предполагаю, что добавление это к этому событию в базовом классе Controller прекрасно, так как каждая страница запускает действие в MVC, поэтому не должно иметь большого значения, и возможность перенаправления должна быть проще. Это имеет смысл, но мне кажется, что мне кажется, что это может быть сделано в случае перед этим событием и заставляет нас сомневаться в том, для чего предназначены эти события? Будет давать OnActionExecuting
a go..
Ответы
Ответ 1
1) Когда пользователь выходит из системы (выдает форму в действии), я хочу перенаправить на страницу входа.
public ActionResult Logout() {
//log out the user
return RedirectToAction("Login");
}
2) В контрольном или базовом событии Controller, например Initialze, я хочу перенаправить на другую страницу (AbsoluteRootUrl + Controller + Action)
Почему вы хотите перенаправить с init-контроллера?
механизм маршрутизации автоматически обрабатывает поступающие запросы, если вы хотите, чтобы вы перенаправляли из действия индекса на контроллере, просто выполните:
public ActionResult Index() {
return RedirectToAction("whateverAction", "whateverController");
}
Ответ 2
1) Чтобы перенаправить на страницу входа/с страницы входа, не используйте методы Redirect(). Используйте FormsAuthentication.RedirectToLoginPage()
и FormsAuthentication.RedirectFromLoginPage()
!
2) Вы должны просто использовать RedirectToAction ( "действие", "контроллер" ) в обычных сценариях.
Вы хотите перенаправить в сторону метод Initialize? Зачем? Я не понимаю, почему вы когда-нибудь захотите это сделать, и в большинстве случаев вам следует рассмотреть ваш подход imo.. Если вы хотите сделать это для аутентификации, это НЕПРЕДНАМЕРЕННО неправильным способом (с очень небольшим количеством шансов против исключения)
Вместо этого используйте атрибут [Authorize]
на вашем контроллере или методе:)
UPD:
если у вас есть проверки безопасности в методе Initialise, и у пользователя нет доступа к этому методу, вы можете сделать несколько вещей:
а)
Response.StatusCode = 403;
Response.End();
Это приведет к возврату пользователя на страницу входа в систему.
Если вы хотите отправить его в обычное место, вы можете сделать что-то вроде этого (cautios: pseudocode)
Response.Redirect(Url.Action("action", "controller"));
Не нужно указывать полный URL. Этого должно быть достаточно.
Если вы полностью настаиваете на полном URL-адресе:
Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString());
Ответ 3
RedirectToAction("actionName", "controllerName");
У этого есть другие перегрузки, пожалуйста, проверьте!
Кроме того, если вы новичок, и вы не используете T4MVC, я бы рекомендовал вам его использовать!
Это дает вам интеллект для действий, контроллеров, представлений и т.д. (не более магических строк)