在ASP.NET MVC中,response.redirect如何工作?

时间:2010-05-12 20:35:06

标签: asp.net-mvc response.redirect

我在经典ASP和ASP.NET webforms中使用了response.redirect。然而,在MVC 2.0中,我遇到了一些特殊的东西。

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

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

如上所述,我习惯于旧版本的response.redirect,它会阻止页面上的后续代码被执行,因为新页面会加载。

非常感谢任何有关MVC重定向的帮助或建议。

5 个答案:

答案 0 :(得分:45)

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

答案 1 :(得分:19)

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

答案 2 :(得分:9)

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

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

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

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

答案 3 :(得分:2)

推荐使用

在mvc控制器操作中重定向到asp.net表单的唯一方法
return Redirect("/page/pagename.aspx");

其他方式我们可以通过使用(不推荐和坏方法)重定向

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

它可以用于重定向,但问题是它将清除所有的Session值。所以为什么不推荐它。

答案 4 :(得分:-3)

在mvc视图页面lode

中尝试此代码
        if (Session["UserName"] == null)
        {
            this.Response.Redirect("LogOn");

        }