【问题标题】:Razor page lifecycle in ASP.NET MVCASP.NET MVC 中的 Razor 页面生命周期
【发布时间】:2012-01-01 22:08:10
【问题描述】:

关于渲染管道的一般问题,我看过 ASP.NET MVC 管道方案,并且有一个称为 View Engine 的步骤,那么它是如何工作的?我想了解这种情况:

  • 首先呈现的是什么,母版页还是视图?
  • 如果我在页面开头的@{} 块中使用Response.End(),这会中断页面​​的执行并停止视图的呈现吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor pipeline


    【解决方案1】:

    首先呈现的是什么,母版页还是视图?

    视图。解析器从布局开始,构建一个 LIFO(后进先出)结构,递归到子视图和部分视图。一旦 LIFO 准备就绪,它就会开始弹出并处理元素。这意味着最内部的部分/视图将在布局之前处理,最后一个要处理的是布局本身。

    如果我在页面开头的 @{} 块中使用 Response.End() 会这样做 中断页面的执行并停止视图的渲染?

    在任何视图中使用Response.End 都会导致呈现完全空白的页面。切勿在任何视图中使用。 Response.End 基本上通过触发 ThreadAbortException 来中止当前线程,这不是您想要在 Razor 视图中执行的操作。

    【讨论】:

      【解决方案2】:

      看看史蒂夫桑德森的Request-Handling Pipeline Poster。它非常详细地解释了整个请求过程。它来自 MVC 1.0 版,但它仍然有效。只需将“WebForm”替换为 Razor。

      首先渲染主视图还是视图确实不应该打扰您。你能解释一下为什么这对你很重要吗?

      【讨论】:

      • 有时很高兴知道事情是如何运作的,这有助于理解为什么它会这样而不是其他方式:)
      • 我可以证明这方面的知识很好。我一直在我的项目中使用盒式磁带进行捆绑。它具有在页面中“包含”资源包的静态方法。子视图中像@{ Bundles.Reference("~/bundle/pageScripts", "Head");} 这样的代码块将首先执行,如果它依赖于布局中定义的 jquery,则布局的代码将在子视图之后执行,这将导致脚本文件的顺序不正确。有多种方法可以解决此问题,但有助于了解为什么调用按此顺序发生。
      • @JonathanTech 给出的原因是我也需要知道这一点的原因——只是我使用的是 MVC4 的 System.Web.Optimization 而不是 Cassette。不过同样的想法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多