C# 哪个类负责生成响应?
我不熟悉Razor引擎,只是对在ASP.NET MVC中生成响应有一个问题 首先,我们知道视图引擎的作用是将视图请求转换为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
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);
}