我一直在观看有关 Scott Hanselmnn 教授 MVC 2 技巧/提示的视频。他提到默认情况下 MVC 2 如何使用 ASP.NET Web 窗体视图引擎来呈现视图的输出;他提到 Web 表单视图引擎比 MVC 2 慢一点,因为它会生成一个控制树,然后将 HTML 输出到页面(我希望我说的没错)。
我想知道他在将 HTML 输出到页面之前生成代码树的 Web 表单是什么意思。有没有人对 Web 表单的视图引擎和渲染过程的步骤适用于 ASP.NET 和 MVC2 有见解?
我一直在观看有关 Scott Hanselmnn 教授 MVC 2 技巧/提示的视频。他提到默认情况下 MVC 2 如何使用 ASP.NET Web 窗体视图引擎来呈现视图的输出;他提到 Web 表单视图引擎比 MVC 2 慢一点,因为它会生成一个控制树,然后将 HTML 输出到页面(我希望我说的没错)。
我想知道他在将 HTML 输出到页面之前生成代码树的 Web 表单是什么意思。有没有人对 Web 表单的视图引擎和渲染过程的步骤适用于 ASP.NET 和 MVC2 有见解?
在 Web 窗体中,HTML 由控件的层次结构生成,每个控件都需要被调用以呈现其 HTML,并且每个控件都对 Page ViewState 有贡献。此外,Web 窗体(Init、PreRender 等)在其生命周期中会触发很多事件,并且层次结构中的每个控件也会触发类似的事件。
在 MVC 中,该过程理论上可以简单得多,因为您没有深层次的控件,没有 ViewState,也不需要触发事件。然而,MVC 从 ASP.NET 框架中“捎带”出来,因此在幕后,许多 Web 窗体的东西仍然存在,尽管它不是必需的。
ASP.Net WebForms 都是围绕“伪造”一个围绕 HTTP 的无状态特性的持久性、有状态模型的想法构建的。这个想法是为 WinForms 开发人员提供一个熟悉的工作环境,即控件、事件等...
为此,将标记解析为内存中的对象集合,然后您可以像在 WinForms 中的控件一样引用这些对象:
TextBox.Text = "I hate viewstate!";
每个控件都添加到一个控件集合中,这些控件代表要发送回客户端的页面。当需要构建响应时,引擎会遍历控件的树集合,并要求每个控件将自身渲染到输出流。结果就是您以 HTTP 响应的形式获得的结果。
在 MVC 中,这是一个不必要的步骤,因为这些控件从未被引用。MVC 包含 Web 的无状态特性,而是将发布的表单变量直接映射到模型以供控制器操作使用。