哪个类负责产生响应?

时间:2019-08-07 07:50:43

标签: c# asp.net-mvc .net-core asp.net-core-mvc razorengine

我是Razor Engine的新手,只是有一个关于在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引擎返回一个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#类,以下是index.cshtml生成的C#代码的示例:

public class ASPV_Views_Home_Index_cshtml : RazorPage<string[]> {
   ...
   public override async Task ExecuteAsync() {
      ...//this method also seems to generate response
   }
}

所以ExecuteAsync也似乎会产生响应

最后,如果我们查看动作方法返回的ViewResult对象,则ViewResultActionResult(实现IActionResult)实现为

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

ExecuteResultAsync似乎也可以产生响应。

所以我们有三个候选人

1-RazorView.RenderAsync()

2-{{​​1}}

3-RazorPage.ExecuteAsync()

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

1 个答案:

答案 0 :(得分:3)

ExecuteResultAsync根据结果的类型(ViewResultPageResultContentResultJsonResult等)进行不同的处理。对于ViewResult,它的主要职责是设置HttpResponse对象属性(StatusCodeContentTypeBody等)。

内部ExecuteResultAsync调用RenderAsync,负责渲染视图及其布局。

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

您可以下载.NET Core存储库AspNetCore,并检查在Microsoft.AspNetCore.Mvc名称空间下的所有连接方式的详细信息。