文章收藏:Web 窗体代码模型
Web 窗体页由两部分组成:视觉元素(HTML、服务器控件和静态文本)和该页的编程逻辑。Visual Studio 将这两个组成部分分别存储在一个单独的文件中。可视元素在一个 .aspx 文件中创建,而代码位于一个单独的类文件中,该文件称作代码隐藏类文件(.aspx.vb 或 .aspx.cs)。 也可以在同一文件中创建视觉元素和代码,该文件有时称作“单文件”Web 窗体页。在 Visual Studio 中,对这种 Web 窗体页的支持比较有限。有关详细信息,请参见以下的“单文件 Web 窗体页”。 注意 Visual Studio 在 Web 窗体页和项目中不支持跨语言编译。这意味着不可能在 Visual Basic Web 项目中包含 Visual C# Web 窗体页,反之亦然。 ASP.NET Page 类虽然一个 Web 窗体页由两个单独的文件组成,但这两个文件在应用程序运行时形成了一个整体。项目中所有 Web 窗体的代码隐藏类文件都被编译成由项目生成的动态链接库 (.dll) 文件。Web 窗体 .aspx 页文件也会被编译,但编译的方式稍有不同。当用户第一次浏览到 .aspx 页时,ASP.NET 自动生成表示该页的 .NET 类文件,并将其编译成另一个 .dll 文件。为 .aspx 页生成的类从被编译成项目 .dll 文件的代码隐藏类继承。 只要 Web 窗体页受到请求,此 .dll 文件就会在服务器上运行。在运行时,此 .dll 文件通过动态创建输出并将其发送回浏览器或客户端设备来处理传入请求和响应。 如果该页像通常情况下一样包含服务器控件,派生的页类则用作控件的容器。控件的实例在运行时创建,并且同样地为浏览器或客户端设备呈现输出。 对于熟悉 Active Server Pages (ASP) 的开发人员,ASP.NET 页框架模型向他们展现了一些新的内容。ASP 模型是通过脚本代码扩展的 HTML 模型。ASP 页由脚本代码(如 ECMAScript (JScript, JavaScript) 或 VBScript)组成,脚本代码与静态 HTML 共同位于同一文件中。ASP 分析器读取该页,对其进行解释,并仅运行脚本代码来获取输出结果。在将输出发送回浏览器或客户端设备之前,ASP 会合并脚本代码的输出和在该页中发现的静态 HTML 输出。 在 ASP.NET Page 类模型中,整个 Web 窗体页实际上是一个可执行程序,该程序生成将被发送回浏览器或客户端设备的输出。在此模型中,该页会像其他组件一样经历一系列处理阶段:初始化、处理和处置,但有两处不同:
从 Page 类派生当 Visual Studio 为 Web 窗体页创建页和类文件时,它将生成从基 Page 类继承的代码。例如,如果创建新的 Web 窗体页并将其命名为 WebPage1,则会从 System.Web.UI.Page 派生一个名为 WebPage1 的新类。 根据您是否已选择将 Visual Basic 或 Visual C# 用于部署,Visual Studio 将生成以下代码行之一: ' Visual Basic Public Class WebForm1 Inherits System.Web.UI.Page // C# public class WebForm1 : System.Web.UI.Page .aspx 页文件又从派生的 WebPage1 类继承。下图阐释了基 Page 类、派生的类文件和 .aspx 文件的关系。 Web 窗体页结构和 Page 基类 由于 .aspx 文件在用户浏览该页时会动态地进行编译,它与类文件的关系将通过页顶部的脚本指令来建立。在 Visual Studio 中,即使您将 Web 窗体页重命名,.aspx 文件和类文件之间的关系仍会自动创建和维护。具体地说,@ Page 指令的 Inherits 属性用于指定 .aspx 文件派生自的类文件。常见的指令类似于如下所示: <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb"
Codebehind、Inherits 和 Src 属性在使用代码隐藏文件的 Web 窗体中,@ Page 指令(或用户控件文件中的 @ Control)包含了指定 .aspx 文件与其代码隐藏文件的关系的属性。这些属性是:
上面显示的代码隐藏模型是由 Visual Studio 使用的模型。ASP.NET Framework 为 Web 窗体页支持一种稍有不同的代码隐藏模型。在 ASP.NET 代码隐藏模型中,可视元素位于 .aspx 文件中,而代码位于单独的纯代码文件中,就像在 Visual Studio 中那样。但是没有项目,另外,代码不是经过预编译的,而是在用户首次请求该页时,在运行时编译 .vb 或 .cs 文件中的代码。 继承模型的工作方式如上图所示,但不同之处在于 Web 窗体类(图中的 WebForm1 类)不是项目程序集的一部分。相反,每个页都是一个单独的程序集。在这两种模型中,代码的运行方式是相同的。 在 ASP.NET 代码隐藏模型中,没有 Codebehind 页属性,因为它是 Visual Studio 所特有的属性。为了使 .aspx 文件与其对应代码关联,页指令包含一个 Src 属性,该属性引用包含该文件源代码的文件。 在 Visual Studio 中不支持 Src 属性。如果将 Web 窗体页导入到包含 Src 属性的 Visual Studio 中,则设计器将引发错误。有关详细信息,请参见在 Web 窗体设计器中未能加载该文件。 单文件 Web 窗体页除了由 .aspx 文件和单独的类文件组成的页之外,ASP.NET 结构还支持“单文件”模型,在此模型中,UI 元素和代码位于同一文件中。单文件 Web 窗体页在功能上与由两个文件组成的页非常类似。例如,在两种类型的页上使用的是相同的控件。用户仍使用相同的文件扩展名 .aspx 来请求页,页仍使用服务器端代码来运行,并且页会以流的形式将 HTML 发送到客户端。单文件页具有易于部署的优点。 单文件页的处理方式存在一些不同之处:
虽然可以在 Visual Studio 中使用单文件 Web 窗体页,但由于 Visual Studio 面向双文件、代码隐藏模型,因此对单文件页的支持存在较多的限制。不同之处包括:
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构