返回 ActionResult 的操作有什么意义?
3 回答
返回一个 ActionResult 而不是“只是做任何 ActionResult 正在做的事情”(即直接使用 Response.Redirect 或尝试直接通过 Response OutputStream 渲染出一个视图)给你一个非常好的优势:单元测试真的很容易,尤其是因为您通常不需要 Web 服务器来对 MVC 项目进行单元测试。
附录:作为重定向的示例:
如果你这样做
return Redirect(newUrl);
在您的控制器中,您的单元测试现在可以
- 验证返回值是否属于“RedirectResult”类型
- 将其转换为 RedirectResult 后,通过检查 result.Url 来查看重定向到的 URL
- 所有这些都无需启动 IIS 或尝试“聪明地”拦截 Response.Redirect 调用
- 归根结底,RedirectResult 在其 ExecuteResult 函数中调用 Response.Redirect,但您的控制器单元测试位于其前面
附录 2:当我在上面的时候,这里是一个自定义 ActionResult 的例子:
http://www.stum.de/2008/10/22/permanentredirectresult/
这只是为了表明他们不是“黑魔法”。它们实际上非常简单:您的 Controller 返回一个 Action Result,而 MVC Runtime 最终将在其上调用 ExecuteResult 函数,传入一个您的 ActionResult 可以与之交互的 ControllerContext。重点还是要分离 MVC 的各个部分,使代码可重用,并使单元测试更容易,或者简而言之:提供一个非常干净的框架。
由于它是基类,它允许您返回任何 ActionResult 子类,例如 ViewResult 或 JsonResult。我通常返回 ViewResult 作为默认值,但如果我正在处理 Ajax 以返回 JsonResult 对象,则会覆盖该行为。
这使我可以将 Ajax 添加为渐进式增强功能,并让应用程序在没有 JavaScript 的情况下运行,并且不需要单独的控制器操作。
ActionResult 是许多不同类型的控制器结果的基类。通过返回基类,控制器动作可以根据方法的结果返回不同类型的结果——ViewResult、RedirectToActionResult 等。ActionResult 包含视图所需的所有数据或作为结果的新动作当前控制器动作。