ASP.NET MVC: как правильно перенаправить страницы / действия в MVC? - PullRequest
28 голосов
/ 20 апреля 2010

Я довольно новичок в MVC, но не уверен, какой именно Redirect ... заменяет стандартный редирект, используемый в WebForms, то есть стандарт Response.Redirect()

Например, мне нужно перенаправить на другие страницы в нескольких сценариях:

1) Когда пользователь выходит из системы (формы выходят в действии), я хочу перенаправить на страницу входа.

2) В событии Controller или base Controller, например, Initialize, я хочу перенаправить на другую страницу (AbsoluteRootUrl + Controller + Action)

Кажется, что в некоторых случаях вызывается несколько переадресаций, что вызывает ошибки, что связано с тем, что страница уже перенаправляется? Как отменить текущий запрос и просто перенаправить?

Обновление:

Ответ на этот вопрос ( System.Web.Mvc.Controller Initialize ) указывает, что Initialize не следует использовать и OnActionExecuting следует использовать?

Любые комментарии о том, почему Initialize не следует использовать или почему OnAuthorization не лучший вариант?

Подробнее:

Этот пост в блоге (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) указывает, что OnActionExecuting полезен для аутентификации (как указано в ссылке выше). Я думаю, что добавить это к этому событию в базовом классе Controller можно, так как на каждой странице выполняется действие в MVC так не должно иметь большого значения, и возможность перенаправления должна быть проще. Это имеет смысл, но мне также кажется, что для меня есть смысл сделать что-то в событии до этого события, и это заставляет нас задаться вопросом, что это за события. для? Будет ли OnActionExecuting идти ..

Ответы [ 3 ]

24 голосов
/ 20 апреля 2010

1) Когда пользователь выходит из системы (формы выходят из системы в действии), я хочу перенаправить на страницу входа.

public ActionResult Logout() {
    //log out the user
    return RedirectToAction("Login");
}

2) В событии Controller или base Controller, например Initialze, я хочу перенаправить на другую страницу (AbsoluteRootUrl + Controller + Action)

Почему вы хотите перенаправить с контроллера init?

механизм маршрутизации автоматически обрабатывает поступающие запросы, если вы имеете в виду, что хотите перенаправить действие index на контроллере, просто выполните:

public ActionResult Index() {
    return RedirectToAction("whateverAction", "whateverController");
}
5 голосов
/ 20 апреля 2010

1) Чтобы перенаправить на страницу входа / со страницы входа, не используйте методы Redirect (). Используйте FormsAuthentication.RedirectToLoginPage() и FormsAuthentication.RedirectFromLoginPage()!

2) Вы должны просто использовать RedirectToAction («action», «controller») в обычных сценариях. Вы хотите перенаправить в сторону метод 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());
2 голосов
/ 20 апреля 2010
RedirectToAction("actionName", "controllerName");

Имеются и другие перегрузки, пожалуйста, проверьте!

Также, если вы новичок и не используете T4MVC , то я бы порекомендовал вам его использовать!

Это дает вам интеллект для действий, контроллеров, представлений и т. Д. (Больше никаких волшебных строк)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...