【发布时间】:2012-01-01 22:08:10
【问题描述】:
关于渲染管道的一般问题,我看过 ASP.NET MVC 管道方案,并且有一个称为 View Engine 的步骤,那么它是如何工作的?我想了解这种情况:
- 首先呈现的是什么,母版页还是视图?
- 如果我在页面开头的
@{}块中使用Response.End(),这会中断页面的执行并停止视图的呈现吗?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 razor pipeline
关于渲染管道的一般问题,我看过 ASP.NET MVC 管道方案,并且有一个称为 View Engine 的步骤,那么它是如何工作的?我想了解这种情况:
@{} 块中使用Response.End(),这会中断页面的执行并停止视图的呈现吗?【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 razor pipeline
首先呈现的是什么,母版页还是视图?
视图。解析器从布局开始,构建一个 LIFO(后进先出)结构,递归到子视图和部分视图。一旦 LIFO 准备就绪,它就会开始弹出并处理元素。这意味着最内部的部分/视图将在布局之前处理,最后一个要处理的是布局本身。
如果我在页面开头的 @{} 块中使用 Response.End() 会这样做 中断页面的执行并停止视图的渲染?
在任何视图中使用Response.End 都会导致呈现完全空白的页面。切勿在任何视图中使用。 Response.End 基本上通过触发 ThreadAbortException 来中止当前线程,这不是您想要在 Razor 视图中执行的操作。
【讨论】:
看看史蒂夫桑德森的Request-Handling Pipeline Poster。它非常详细地解释了整个请求过程。它来自 MVC 1.0 版,但它仍然有效。只需将“WebForm”替换为 Razor。
首先渲染主视图还是视图确实不应该打扰您。你能解释一下为什么这对你很重要吗?
【讨论】:
@{ Bundles.Reference("~/bundle/pageScripts", "Head");} 这样的代码块将首先执行,如果它依赖于布局中定义的 jquery,则布局的代码将在子视图之后执行,这将导致脚本文件的顺序不正确。有多种方法可以解决此问题,但有助于了解为什么调用按此顺序发生。