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

Swo*_*op 29 asp.net-mvc response.redirect

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

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

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

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

任何有关MVC重定向的帮助或建议都将不胜感激.

Jas*_*rue 46

在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);
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*vey 20

在ASP.NET MVC中,您通常会通过RedirectResult从控制器方法返回a 来重定向到另一个页面.

例:

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);
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*kel 10

在MVC中从不使用Response.Redirect

return RedirectToAction("ActionResultName", "ControllerName");
Run Code Online (Sandbox Code Playgroud)

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

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