【问题标题】:In ASP.NET MVC, how does response.redirect work?在 ASP.NET MVC 中,response.redirect 是如何工作的?
【发布时间】:2010-05-12 20:35:05
【问题描述】:

我在经典的 ASP 和 ASP.NET 网络表单中使用了 response.redirect。但是,对于 MVC 2.0,我遇到了一些奇怪的事情。

我在控制器类中有一个私有方法,多个控制器方法使用它来帮助加载和验证某些信息。如果发现问题,则将此私有方法设置为重定向到通用错误消息页面。

我注意到的大问题是调用控制器类和页面视图试图在重定向实际发生之前完成渲染和加载。这在开发中很烦人,因为在我的通用错误页面最终加载之前,视图会抛出我需要忽略的异常。

如上所述,我已经习惯了旧的 response.redirect 模型,它阻止了页面上的后续代码在新页面加载时被执行。

任何关于 MVC 中重定向的帮助或建议将不胜感激。

【问题讨论】:

  • 你听说过一种叫做“Fiddler”的诊断工具吗?您可能会发现它对于查看您的网页在做什么非常有用。
  • 我认为您在私有方法中调用Response.Redirect
  • @Russ:response.redirect 在私有方法中,我认为这是问题的一部分。

标签: asp.net-mvc response.redirect


【解决方案1】:

在 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);
}

【讨论】:

  • 这解释了我所看到的,并且是一个很好的解决方案。感谢您的帮助!
  • 嗨,Jason,您能否评论一下为什么代码继续执行而不是线程被中止,根据 WebForms Response.Redirect
  • @JasonTrue:是的,我也想知道为什么线程没有终止。
【解决方案2】:

在 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);
}

【讨论】:

  • 很好的答案。感谢您的帮助!
【解决方案3】:

在 MVC 中永远不要使用 Response.Redirect 使用

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

至于 为什么 在 MVC 中不使用 Response.Redirect:

  1. 性能问题
  2. 不遵循专门为 MVC 构建的标准 asp.net MVC 模式和约定。

【讨论】:

    【解决方案4】:

    这是推荐的,也是通过使用在 mvc 控制器操作中重定向到 asp.net 表单的唯一方法

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

    我们可以使用其他方式重定向(不推荐和不好的方式)

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

    它适用于重定向,但问题是它会清除我们所有的 Session 值。那为什么不推荐呢。

    【讨论】:

      【解决方案5】:

      在 mvc 视图页面 lode 中尝试此代码

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

      【讨论】:

      • 我们强烈反对在 MVC 应用程序中调用 Response.Redirect。您应该从操作或过滤器返回一个 RedirectResult。
      • @RickAnd - MSFT 为什么不鼓励它?我知道显然 RedirectResult 是优越的,但为什么不鼓励 Response.Redirect 呢?
      • 好问题,请参阅我的博客 Response.Redirect 和 ASP.NET MVC – 不要在blogs.msdn.com/b/rickandy/archive/2012/03/01/…混用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多