我是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);
}
,在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生成的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
(实现IActionResult
)实现为
public class ViewResult : ActionResult
{
...
public override Task ExecuteResultAsync(ActionContext context);
}
ExecuteResultAsync
似乎也可以产生响应。
所以我们有三个候选人
1-RazorView.RenderAsync()
2-{{1}}
3-RazorPage.ExecuteAsync()
哪一个是产生响应的真正方法?
答案 0 :(得分:3)
ExecuteResultAsync
根据结果的类型(ViewResult
,PageResult
,ContentResult
,JsonResult
等)进行不同的处理。对于ViewResult
,它的主要职责是设置HttpResponse
对象属性(StatusCode
,ContentType
,Body
等)。
内部ExecuteResultAsync
调用RenderAsync
,负责渲染视图及其布局。
同样,内部RenderAsync
调用ExecuteAsync
。 ExecuteAsync
是剃刀语法的实际呈现方式。
您可以下载.NET Core存储库AspNetCore,并检查在Microsoft.AspNetCore.Mvc
名称空间下的所有连接方式的详细信息。