在ASP.NET MVC 3上,假设我们有以下控制器操作:
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
类?我特别好奇这一部分。
答案 0 :(得分:1)
ControllerActionInvoker
类负责执行控制器操作。找到并执行操作后,它会查找操作返回类型:
void
,则会创建EmptyResult
ActionResult
之外的任何内容,则它会将返回的值转换为字符串,并使用该字符串创建ContentResult
。所以最后一个动作的结果始终是ActionResult
类的一个实例,它声明了以下方法:
public abstract void ExecuteResult(ControllerContext context);
然后,ControllerActionInvoker
基本上调用此ExecuteResult
方法,以允许ActionResult
写入Reponse
。在ViewResultBase
的情况下,视图渲染正在发生
要在MVC3中回答你的第一个问题,只有ViewResultBase
类的descandants是渲染视图。