是否有任何其他基类来查找System.Web.Mvc.ViewResultBase以外的视图

时间:2011-12-17 20:10:15

标签: asp.net asp.net-mvc asp.net-mvc-3

在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类?我特别好奇这一部分。

1 个答案:

答案 0 :(得分:1)

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

  1. 如果返回类型为void,则会创建EmptyResult
  2. 如果返回类型除ActionResult之外的任何内容,则它会将返回的值转换为字符串,并使用该字符串创建ContentResult
  3. 所以最后一个动作的结果始终是ActionResult类的一个实例,它声明了以下方法:

    public abstract void ExecuteResult(ControllerContext context);
    

    然后,ControllerActionInvoker基本上调用此ExecuteResult方法,以允许ActionResult写入Reponse。在ViewResultBase的情况下,视图渲染正在发生 要在MVC3中回答你的第一个问题,只有ViewResultBase类的descandants是渲染视图。