В ASP.NET MVC, как работает response.redirect? - PullRequest
29 голосов
/ 13 мая 2010

Я использовал response.redirect в классических веб-формах ASP и ASP.NET. Однако с MVC 2.0 я сталкиваюсь с чем-то особенным.

У меня есть частный метод в классе контроллера, который используется несколькими методами контроллера, чтобы помочь загрузить и проверить некоторую информацию. Этот закрытый метод настроен на перенаправление, если обнаружена проблема, на страницу общего сообщения об ошибке.

Большая проблема, которую я замечаю, заключается в том, что вызывающий класс контроллера и просмотр страницы пытаются завершить рендеринг и загрузку до того, как перенаправление действительно произойдет. Это раздражает в разработке, потому что представление генерирует исключения, которые мне нужно игнорировать, прежде чем моя общая страница ошибок наконец загрузится.

Как упомянуто выше, я привык к более старой модели response.redirect, которая препятствовала выполнению последующего кода на странице, поскольку новая страница затем будет загружаться.

Любая помощь или совет по перенаправлению в MVC будет принята с благодарностью.

Ответы [ 5 ]

46 голосов
/ 13 мая 2010

Обычный механизм перенаправления в ASP.Net MVC - это возврат объекта типа RedirectResult клиенту. Если это будет сделано до того, как ваш метод View будет вызван, ваши методы представления никогда не будут вызваны.

Если вы вызываете Response.Redirect самостоятельно, вместо того, чтобы позволить фронт-контроллеру Asp.Net MVC сделать это за вас, ваш метод контроллера будет продолжаться до тех пор, пока он не завершит работу или не выдаст исключение.

Идиоматическое решение вашей проблемы состоит в том, чтобы ваш приватный метод возвращал результат, который может использовать ваш контроллер.

например:

public ActionResult Edit(MyEntity entity)
{
  if (!IsValid()) return Redirect("/oops/");
  ...
  return View();

}

private bool IsValid()
{
  if (nozzle==NozzleState.Closed) return false;
  if (!hoseAttached) return false;
  return (userRole==Role.Gardener);
}
20 голосов
/ 13 мая 2010

В ASP.NET MVC вы обычно перенаправляете на другую страницу, возвращая RedirectResult из метода контроллера.

Пример:

public ActionResult Details(int id)
{
     // Attempt to get record from database
     var details = dataContext.GetDetails(id);

     // Does requested record exist?
     if (details == null)
     {
         // Does not exist - display index so user can choose
         return RedirectToAction("Index");
     }

     // Display details as usual
     return View(details);
}
10 голосов
/ 15 марта 2012

В MVC никогда не используйте Response.Redirect используйте

return RedirectToAction("ActionResultName", "ControllerName");

Что касается ПОЧЕМУ НЕ использовать Response.Redirect в MVC:

  1. Проблемы с производительностью
  2. Не соответствует стандартному шаблону MVC asp.net и соглашениям, разработанным специально для MVC.
2 голосов
/ 30 октября 2015

рекомендуется и это единственный способ перенаправить на форму asp.net в действии контроллера mvc с помощью

return Redirect("/page/pagename.aspx");

другим способом мы можем перенаправить, используя (не рекомендуется и плохой способ)

Response.Redirect("/page/pagename.aspx", true);

это будет работать для перенаправления, но проблема в том, что он очистит все наши значения сеанса. так почему его не рекомендуется.

0 голосов
/ 06 августа 2011

попробуйте этот код на странице просмотра mvc lode

        if (Session["UserName"] == null)
        {
            this.Response.Redirect("LogOn");

        }
...