哪个 class 负责生成响应?

which class is responsible for generating response?

我是 Razor 引擎的新手,只是对在 ASP.NET MVC

中生成响应有疑问

首先,我们知道视图引擎的作用是将视图请求翻译成ViewEngineResult对象,而Razor视图引擎实现了IViewEngine

public interface IViewEngine
{
   ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage);
   ViewEngineResult GetView(string executingFilePath, string viewPath, bool isMainPage);

}

并且在 FindViewGetView 方法中,Razor 引擎 return 一个 ViewEngineResult 对象为:

// pseudo code for simplification
if view_found 
   return ViewEngineResult.Found(viewName, new RazorView(...));

RazorViewIView 实现为:

public class RazorView : IView
{
   public string Path { get; }
   public virtual Task RenderAsync(ViewContext context);
}

RenderAsync 函数似乎是产生响应的人。

但是 .cshtml 文件也被 Razor 引擎编译成 C# class,下面是 index.cshtml:

的 n 个示例生成的 C# 代码
public class ASPV_Views_Home_Index_cshtml : RazorPage<string[]> {
   ...
   public override async Task ExecuteAsync() {
      ...//this method also seems to generate response
   }
}

所以 ExecuteAsync 似乎也产生了响应

最后,如果我们查看 ViewResult 对象 return 通过 action 方法,ViewResult implements ActionResult(implements IActionResult) as

public class ViewResult : ActionResult
{
  ...
  public override Task ExecuteResultAsync(ActionContext context); 
}

ExecuteResultAsync 似乎也产生了响应。

所以我们有三个候选人

1-RazorView.RenderAsync()

2-RazorPage.ExecuteAsync()

3-ViewResult.ExecuteResultAsync()

哪一个是真正产生响应的?

根据结果​​的类型(ViewResultPageResultContentResultJsonResult 等),

ExecuteResultAsync 的处理方式不同。在 ViewResult 的情况下,它的主要职责是设置 HttpResponse 对象属性(StatusCodeContentTypeBody 等)。

内部 ExecuteResultAsync 调用 RenderAsync 负责呈现视图及其布局。

同样,内部 RenderAsync 调用 ExecuteAsyncExecuteAsync 是剃刀语法的实际呈现。

您可以下载 .NET Core 存储库 AspNetCore 并检查在 Microsoft.AspNetCore.Mvc 命名空间下如何连接所有内容的详细信息。