Подтвердить что ты не робот

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..

4b9b3361

Ответ 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, я бы рекомендовал вам его использовать!

Это дает вам интеллект для действий, контроллеров, представлений и т.д. (не более магических строк)