文章收藏:Web 窗体代码模型 荣

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" Inherits="WebApplication1.WebForm1"%>

Codebehind、Inherits 和 Src 属性

在使用代码隐藏文件的 Web 窗体中,@ Page 指令(或用户控件文件中的 @ Control)包含了指定 .aspx 文件与其代码隐藏文件的关系的属性。这些属性是:

  • Codebehind   在 Visual Studio 中,此属性引用包含页类的文件的名称。例如,如果在 Visual Studio 中创建名为 WebForm1 的 Web 窗体页,则 Codebehind 属性将指向 WebForm1.aspx.vbWebForm1.aspx.cs。此属性仅由 Visual Studio Web 窗体设计器使用。此属性会通知设计器在何处查找页类,以便设计器可以创建它的一个实例,以供您使用。在运行时不使用此属性。
  • Inherits   标识页从其派生的类。在 Visual Studio 中,此属性指向项目程序集 (.dll) 中的类,如上图所示。

上面显示的代码隐藏模型是由 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 发送到客户端。单文件页具有易于部署的优点。

单文件页的处理方式存在一些不同之处:

  • 不会将该页的代码编译成一个单独的类,然后从该类派生 .aspx 文件。相反,.aspx 文件将直接从 Page 类派生。
  • 当部署该页时,由于源代码在物理上位于 .aspx 文件中,所以源代码将与 Web 窗体页一起部署。(用户看不到该代码,也就是说,仅向用户发送该页运行时所呈现的结果。)

虽然可以在 Visual Studio 中使用单文件 Web 窗体页,但由于 Visual Studio 面向双文件、代码隐藏模型,因此对单文件页的支持存在较多的限制。不同之处包括:

  • 不能直接在 Visual Studio 中创建单文件 Web 窗体页。当创建新页时,Visual Studio 会在默认情况下创建单独的 .aspx 文件和类文件。若要创建单文件页,必须在一开始就将其创建为文本文件,然后将其扩展名更改为 .aspx。
  • 不能通过从工具箱中拖动将非可视组件(如数据组件)添加到该页上,因为 Web 窗体设计器不会在该页中持久保存这些组件。相反,应使用代码添加这种组件。
  • 在 HTML 视图中而不是在代码编辑器中编写代码。
  • 当您编写代码时,Intellisense 将受不到支持,您得不到语法检查或语句结束、制表位设置或代码格式设置等功能。
  • 必须手动将事件绑定到事件处理程序。对于单文件 Web 窗体页,Visual Studio 不支持通过双击为控件的默认事件创建处理程序,也不支持代码编辑器中类和事件的下拉列表。
  • 不支持某些调试功能,例如不能够通过将鼠标指向一个变量值来查看该变量值。
  • 由于不会将该页中的代码编译成项目程序集,所以在运行该页之前不会捕获编译时错误。

原文出处:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vbcon/html/vbconwebformscodemodel.asp


原文地址:https://www.cnblogs.com/admin11/p/196377.html