哪个 class 负责生成响应?
which class is responsible for generating response?
我是 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 引擎 return 一个 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# class,下面是 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
}
}
所以 ExecuteAsync
似乎也产生了响应
最后,如果我们查看 ViewResult
对象 return 通过 action 方法,ViewResult
implements ActionResult
(implements IActionResult
) as
public class ViewResult : ActionResult
{
...
public override Task ExecuteResultAsync(ActionContext context);
}
ExecuteResultAsync
似乎也产生了响应。
所以我们有三个候选人
1-RazorView.RenderAsync()
2-RazorPage.ExecuteAsync()
3-ViewResult.ExecuteResultAsync()
哪一个是真正产生响应的?
根据结果的类型(ViewResult
、PageResult
、ContentResult
、JsonResult
等),ExecuteResultAsync
的处理方式不同。在 ViewResult
的情况下,它的主要职责是设置 HttpResponse
对象属性(StatusCode
、ContentType
、Body
等)。
内部 ExecuteResultAsync
调用 RenderAsync
负责呈现视图及其布局。
同样,内部 RenderAsync
调用 ExecuteAsync
。 ExecuteAsync
是剃刀语法的实际呈现。
您可以下载 .NET Core 存储库 AspNetCore 并检查在 Microsoft.AspNetCore.Mvc
命名空间下如何连接所有内容的详细信息。
我是 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 引擎 return 一个 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# class,下面是 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
}
}
所以 ExecuteAsync
似乎也产生了响应
最后,如果我们查看 ViewResult
对象 return 通过 action 方法,ViewResult
implements ActionResult
(implements IActionResult
) as
public class ViewResult : ActionResult
{
...
public override Task ExecuteResultAsync(ActionContext context);
}
ExecuteResultAsync
似乎也产生了响应。
所以我们有三个候选人
1-RazorView.RenderAsync()
2-RazorPage.ExecuteAsync()
3-ViewResult.ExecuteResultAsync()
哪一个是真正产生响应的?
ViewResult
、PageResult
、ContentResult
、JsonResult
等),ExecuteResultAsync
的处理方式不同。在 ViewResult
的情况下,它的主要职责是设置 HttpResponse
对象属性(StatusCode
、ContentType
、Body
等)。
内部 ExecuteResultAsync
调用 RenderAsync
负责呈现视图及其布局。
同样,内部 RenderAsync
调用 ExecuteAsync
。 ExecuteAsync
是剃刀语法的实际呈现。
您可以下载 .NET Core 存储库 AspNetCore 并检查在 Microsoft.AspNetCore.Mvc
命名空间下如何连接所有内容的详细信息。