C# 哪个类负责生成响应?

C# 哪个类负责生成响应?,c#,asp.net-mvc,.net-core,asp.net-core-mvc,razorengine,C#,Asp.net Mvc,.net Core,Asp.net Core Mvc,Razorengine,我不熟悉Razor引擎,只是对在ASP.NET MVC中生成响应有一个问题 首先,我们知道视图引擎的作用是将视图请求转换为ViewEngineResult对象,Razor视图引擎实现IViewEngine public interface IViewEngine { ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage); ViewEngineResult GetView(s

我不熟悉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);

}
FindView
GetView
方法中,Razor引擎将
ViewEngineResult
对象返回为:

// pseudo code for simplification
if view_found 
   return ViewEngineResult.Found(viewName, new RazorView(...));
RazorView
IView
实现为:

public class RazorView : IView
{
   public string Path { get; }
   public virtual Task RenderAsync(ViewContext context);
}
RenderAsync
函数似乎就是生成响应的人

但是.cshtml文件也会被Razor引擎编译成C#类,下面是由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
   }
}

executesultasync
似乎也会生成响应

所以我们有三位候选人

1-
RazorView.RenderAsync()

2-
RazorPage.ExecuteAsync()

3-
ViewResult.executesUltAsync()


哪一个是生成响应的真实结果?

ExecuterSultAsync
根据结果的类型进行不同的处理(
ViewResult
PageResult
ContentResult
JsonResult
,等等)。如果是
ViewResult
,则其主要职责是设置
HttpResponse
对象属性(
StatusCode
ContentType
Body
等)

内部
executesultasync
调用
RenderAsync
,该函数负责渲染视图及其布局

同样,在内部
RenderAsync
调用
ExecuteAsync
ExecuteAsync
是razor语法的实际呈现方式


您可以下载.NET Core存储库,并在
Microsoft.AspNetCore.Mvc
命名空间下检查所有内容的连接方式。根据结果的类型,ExecuterSultAsync的处理方式有所不同(
ViewResult
PageResult
ContentResult
JsonResult
等)。在
ViewResult
的情况下,其主要职责是设置
HttpResponse
对象属性(
StatusCode
ContentType
Body
),等等)

内部
executesultasync
调用
RenderAsync
,该函数负责渲染视图及其布局

同样,内部
RenderAsync
调用
ExecuteAsync
ExecuteAsync
是razor语法的实际呈现方式

您可以下载.NET核心存储库,并在
Microsoft.AspNetCore.Mvc
namespace-下检查所有内容的连接方式

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