ActionResult返回类型有什么意义?

时间:2008-11-14 03:38:51

标签: asp.net-mvc actionresult

返回ActionResult的操作有什么意义?

3 个答案:

答案 0 :(得分:20)

返回一个ActionResult而不是“只是做ActionResult正在做的事情”(即直接使用Response.Redirect或尝试直接通过Response OutputStream渲染一个View)给你一个非常好的优势:单元测试真的很容易特别是因为您通常不需要Web服务器来测试MVC项目。

附录:作为重定向的示例:

如果你这样做

return Redirect(newUrl);

在您的控制器中,您的单元测试现在可以

  • 验证返回值是否为“RedirectResult”类型
  • 通过在将其转换为RedirectResult后检查result.Url来查看重定向到的URL
  • 所有这些都无需启动IIS或尝试“清理”拦截Response.Redirect调用
  • 在一天结束时,RedirectResult在其ExecuteResult函数中调用Response.Redirect,但您的控制器单元测试位于其前面

附录2:当我在上面时,这是一个Custom ActionResult的例子:

http://www.stum.de/2008/10/22/permanentredirectresult/

这只是为了表明他们不是“黑魔法”。它们实际上非常简单:您的Controller返回一个Action Result,MVC Runtime最终会调用它上面的ExecuteResult函数,传入一个ActionContext可以与之交互的ControllerContext。重点是将M-V-C的各个部分分开,使代码可重用,并使单元测试更容易,或简而言之:给出一个非常干净的框架。

答案 1 :(得分:2)

由于它是基类,因此它允许您返回任何ActionResult子类,例如ViewResult或JsonResult。我通常将ViewResult作为默认值返回,但如果我正在处理Ajax以返回JsonResult对象,则会覆盖该行为。

这允许我添加Ajax作为渐进增强,并使应用程序在没有JavaScript的情况下工作,而无需单独的控制器操作。

答案 2 :(得分:1)

ActionResult是许多不同类型的控制器结果的基类。通过返回基类,控制器操作可以返回不同类型的结果,具体取决于方法的结果 - ViewResult,RedirectToActionResult等.ActionResult包含View或新Action所需的所有数据,当前的控制器动作。