【问题标题】:When does Razor view engine convert IActionResult to HTML?Razor 视图引擎何时将 IActionResult 转换为 HTML?
【发布时间】:2026-01-11 20:20:03
【问题描述】:

我们知道 Razor 视图引擎将ViewResult(IActionResult) 转换为可以发送给用户的 HTML 响应。下面是过滤器管道的图片:

我的问题是,Razor 视图引擎将在哪个阶段启动并将IActionResult 转换为 HTML,在 Endpoint 完成执行后或在资源过滤器完成执行后立即执行?

【问题讨论】:

    标签: c# .net asp.net-core asp.net-core-mvc razorengine


    【解决方案1】:

    好的,我们肯定知道的是ViewResult类的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() 的方法,您可以将调试断点放置在它们两者上。这两个方法的调用顺序应该会给你答案。

    【讨论】:

    • 非常感谢您的回答。我不能在ExecuteResult() 中放置调试断点,因为它是外部程序集,只有元数据可用。你能给我更多提示吗?对不起,我是 C# 编程的新手
    • 是的,因为它是外部 .dll 我知道两种方法。首先,如果您安装了 resharper,您可以了解如何通过 resharper 调试外部源代码。第二种方法,不需要安装任何额外的工具。您可以从 github 拉取 mvc .net core mvc 源代码,在调试模式下构建它,并将您当前在项目中使用的 .dll 更改为您构建的 .dll。这是一个例子link
    • 因为*有cmets长度的限制,我强烈建议你在网上搜索一下——如何调试asp.net核心源代码。希望对您有所帮助。
    • 如果您将采取第二种解决方案进行调试,请不要忘记备份您当前使用的dll!