2011-12-17 41 views
1

以外的视图在ASP.NET MVC 3,假设我们有以下控制措施:是否有任何其他基类,它看起来比System.Web.Mvc.ViewResultBase

public ActionResult Index() { 

    ViewBag.Message = "Foo Bar"; 
    return View(); 
} 

这里,Index方法返回ViewResult实例System.Web.Mvc.ViewResultBase类。由于我们返回ViewResult类的实例,因此系统会尝试查找适当的视图文件以生成输出。如果找不到它,它会抛出一个异常。

我的问题是这样的:

有它看起来比其他System.Web.Mvc.ViewResultBase一个视图中的任何其他基类?

用简单的英语,我们是否必须从控制器操作返回一个实现System.Web.Mvc.ViewResultBase类的类,以便使结果具有视图?

编辑

而且,你在这里看到我告诉我会返回一个类型的ActionResult这是基础,基础类可以这么说。当您查看结尾时,我将返回ViewResult的实例。

框架如何处理?它是否试图将每个控制器的动作结果投入到ViewResultBase课程中?我特别好奇这部分。

回答

1

ControllerActionInvoker类负责执行控制器操作。找到并执行它查找动作返回类型的操作后:

  1. 如果返回类型为void然后它会创建一个EmptyResult
  2. 如果返回类型什么,但ActionResult然后将其转换返回值的字符串并用该字符串创建一个ContentResult

所以最后一个动作的结果总是ActionResult类的一个实例,它声明了以下方法:

public abstract void ExecuteResult(ControllerContext context); 

然后ControllerActionInvoker基本上调用此ExecuteResult方法来允许ActionResultReponse。在ViewResultBase的情况下,视图呈现正在发生。
要回答你在MVC3中的拳头问题,只有ViewResultBase类的descandants渲染视图。

+0

感谢您的详细回复。你能看到我对这个问题的编辑吗?我对这部分也很好奇。 – tugberk 2011-12-17 21:30:52

+1

不,它不会转换控制器的操作返回值,只是调用它的'ExecuteResult'方法。在ViewResultBase实现中呈现视图并将其写入响应。 – nemesv 2011-12-17 22:25:26

+0

Oww,所以'ViewResultBase'类通常会根据自己的需要重写'ActionResult.ExecuteResult'方法,对吧? – tugberk 2011-12-18 00:14:22

相关问题