Razor 视图引擎何时将 IActionResult 转换为 HTML?
When does Razor view engine convert IActionResult to HTML?
我们知道 Razor 视图引擎将 ViewResult
(IActionResult
) 转换为可以发送给用户的 HTML 响应。下面是过滤器管道的图片:
我的问题是,Razor 视图引擎将在哪个阶段启动并执行 IActionResult
到 HTML 的转换,是在 Endpoint 完成执行之后还是在资源过滤器完成执行之后?
好的,我们肯定知道 ViewResult class 的 ExecuteResult 方法调用了视图引擎。
public void ExecuteResult(ControllerContext context)
{
if (string.IsNullOrEmpty(this.ViewName))
ViewName = context.RouteData.GetRequiredString("action");
var viewEngineResult = (ViewEngineResult) null;
if (View == null)
{
viewEngineResult = this.FindView(context);
View = viewEngineResult.View;
}
var output = context.HttpContext.Response.Output;
View.Render(new ViewContext(context, this.View, this.ViewData, this.TempData, output), output);
if (viewEngineResult == null)
return;
viewEngineResult.ViewEngine.ReleaseView(context, this.View);
}
所以根据上面的代码,我假设 HTML 渲染部分发生在这个方法中。
我们还知道 IResourceFilter 有两个方法(异步版本 IAsyncResultFilter):
void OnResourceExecuting(ResourceExecutingContext context)
void OnResourceExecuted(ResourceExecutedContext context)
第一个方法 OnResourceExecuting 在我们的 api 端点被调用之前执行。
[SimpleResourceFilter]
public IActionResult Index()
{
return View();
}
并且我们可以声明 ExecuteResult 将在 OnResourceExecuting 之后调用。
要验证首先调用 OnResourceExecuted() 或 ExecuteResult() 的方法,您可以将调试断点放置在它们两者上。这两个方法的调用顺序应该会给你答案。
我们知道 Razor 视图引擎将 ViewResult
(IActionResult
) 转换为可以发送给用户的 HTML 响应。下面是过滤器管道的图片:
我的问题是,Razor 视图引擎将在哪个阶段启动并执行 IActionResult
到 HTML 的转换,是在 Endpoint 完成执行之后还是在资源过滤器完成执行之后?
好的,我们肯定知道 ViewResult class 的 ExecuteResult 方法调用了视图引擎。
public void ExecuteResult(ControllerContext context)
{
if (string.IsNullOrEmpty(this.ViewName))
ViewName = context.RouteData.GetRequiredString("action");
var viewEngineResult = (ViewEngineResult) null;
if (View == null)
{
viewEngineResult = this.FindView(context);
View = viewEngineResult.View;
}
var output = context.HttpContext.Response.Output;
View.Render(new ViewContext(context, this.View, this.ViewData, this.TempData, output), output);
if (viewEngineResult == null)
return;
viewEngineResult.ViewEngine.ReleaseView(context, this.View);
}
所以根据上面的代码,我假设 HTML 渲染部分发生在这个方法中。 我们还知道 IResourceFilter 有两个方法(异步版本 IAsyncResultFilter):
void OnResourceExecuting(ResourceExecutingContext context)
void OnResourceExecuted(ResourceExecutedContext context)
第一个方法 OnResourceExecuting 在我们的 api 端点被调用之前执行。
[SimpleResourceFilter]
public IActionResult Index()
{
return View();
}
并且我们可以声明 ExecuteResult 将在 OnResourceExecuting 之后调用。 要验证首先调用 OnResourceExecuted() 或 ExecuteResult() 的方法,您可以将调试断点放置在它们两者上。这两个方法的调用顺序应该会给你答案。