哪个类负责生成响应?

我是 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);


}

在FindVieworGetView方法中,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 的 C# 代码的示例:


public class ASPV_Views_Home_Index_cshtml : RazorPage<string[]> {

   ...

   public override async Task ExecuteAsync() {

      ...//this method also seems to generate response

   }

}

所以ExecuteAsync似乎也产生了反应


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


public class ViewResult : ActionResult

{

  ...

  public override Task ExecuteResultAsync(ActionContext context); 

}

ExecuteResultAsync似乎也产生了反应。


所以我们有三个候选人


1-RazorView.RenderAsync()


2-RazorPage.ExecuteAsync()


3-ViewResult.ExecuteResultAsync()


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


繁花不似锦
浏览 104回答 1
1回答

白衣染霜花

ExecuteResultAsync根据结果的类型(ViewResult、PageResult、ContentResult、JsonResult等)进行不同的处理。对于ViewResult,其主要职责是设置HttpResponse对象属性(StatusCode、ContentType、Body等)。内部ExecuteResultAsync调用RenderAsync负责渲染视图及其布局。再次,内部RenderAsync调用ExecuteAsync. ExecuteAsyncrazor 语法的实际渲染是什么。您可以下载 .NET Core 存储库AspNetCore并检查所有内容如何在命名空间下连接的详细信息Microsoft.AspNetCore.Mvc。
打开App,查看更多内容
随时随地看视频慕课网APP