
1.2 ASP.NET开发入门
1.2.1 ASP.NET介绍
ASP.NET不仅仅是Active Server Page(ASP)的下一个版本,而且还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成缩放性和稳定性更好的应用程序,并提供更好的安全保护。另外,还可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。
ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括Visual Basic .NET、C#和JScript .NET.)创建应用程序。另外,任何ASP.NET应用程序都可以使用整个.NET Framework。开发人员可以方便地使用这些技术的功能,其中包括托管的公共语言运行库环境、类型安全、继承等。
ASP.NET可以无缝地与WYSIWYG HTML编辑器和其他编程工具(包括Microsoft Visual Studio .NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具的所有优点,包括开发人员可以用来将服务器控件拖曳到Web页的GUI和完全集成的调试支持。
当创建ASP.NET应用程序时,开发人员可以使用Web窗体或XML Web Services,或以他们认为合适的方式进行组合。每个功能都能得到同一结构的支持,使你能够使用身份验证方案,缓存经常使用的数据,或者对应用程序的配置进行自定义,这里只列出以下几种可能性。
(1)使用Web窗体可以生成功能强大、基于窗体的Web页。生成这些页时,可以使用ASP.NET服务器控件来创建公共UI元素,以及对它们进行编程以用于执行常见的任务。这些控件能够用可重复使用的内置或自定义组件生成Web窗体,从而简化页面的代码。
(2)XML Web Services提供了远程访问服务器功能的途径。使用XML Web Services,企业可以公开数据或业务逻辑的编程接口,而客户端和服务器应用程序则可以获取和操作这些编程接口。通过使用诸如HTTP和XML消息传递之类的标准跨越防火墙移动数据,XML Web Services可在客户端/服务器或服务器/服务器方案下实现数据的交换。XML Web Services不用依靠特定的组件技术或对象调用约定。因此,用任何语言编写、使用任何组件模型并在任何操作系统上运行的程序,都可以访问XML Web Services。
(3)这些模型中的每一个模型都可以充分利用所有的ASP.NET功能,以及.NET Framework和.NET Framework公共语言运行库的强大功能。这些功能以及使用它们的方法概述如下。
①如果您具有ASP开发技能,则一定很熟悉新的ASP.NET编程模型。不过,与ASP相比,ASP.NET对象模型变化显著,它更为结构化并且面向对象。但这也意味着ASP.NET不是完全向后兼容的,几乎所有现有的ASP页都必须经过一定程度的修改后才可以在ASP.NET下运行。此外,对Visual Basic.NET的一些主要更改也意味着,用Visual Basic Scripting版本编写的ASP页通常将不会直接移植到ASP.NET中。不过,在大多数情况下,只需对少数几行代码进行必要的修改。
②从ASP.NET应用程序访问数据库是Web站点访问者显示数据的常用技术。ASP.NET使得对数据库的访问比以往更加方便,它还能从你的代码管理数据库。
③ASP.NET提供一种简单的模型,该模型使Web开发人员能够编写在应用程序级运行的逻辑,即可以在Global.asax文本文件或在作为程序集部署的已编译类中编写这种代码。这种逻辑可以包括应用程序级事件,但开发人员可以轻松地扩展这种模型,以适应Web应用程序的需要。
④ASP.NET提供易用的应用程序和会话状态功能,它们对于ASP开发人员来说是熟悉的,且容易与所有其他的.NET Framework API兼容。
⑤对于需要使用像ISAPI编程接口(随附于以前的ASP版本中)那样功能强大的API的高级开发人员,ASP.NET提供了IHttpHandler和IHttpModule接口。实现IHttpHandler接口,提供了一种与IIS Web服务器的低级别请求和响应服务交互的手段,并提供与ISAPI扩展非常类似的功能,但编程模型却较为简单。实现IHttpModule接口可以包含参与对应用程序发出的每个请求的自定义事件。
⑥ASP.NET可利用.NET Framework和公共语言运行库中性能增强的功能。另外,它还可以提供相对于ASP和其他Web开发平台来说显著的性能改进。所有ASP.NET代码都是编译的,而不是解释的,这就允许对本机代码采用早期绑定、强类型处理,以及实时(JIT)编译,这里只列举几个优点而已。ASP.NET还可方便地分解,即开发人员可以移除那些与他们开发的应用程序不相关的模块(例如,会话模块)。ASP.NET不仅提供丰富的缓存服务(包括内置服务和缓存API两种),而且还提供性能计数器,开发人员和系统管理员可以监视这些性能计数器,以测试新的应用程序和收集有关现有应用程序的度量标准。
⑦在Web页中编写自定义调试语句,对排除应用程序代码中的错误非常有帮助。但是,如果不移除它们,则会带来麻烦。问题是,在应用程序准备移植到生产服务器时,从页面中移除调试语句会需要很大的工作量。ASP.NET提供TraceContext类,在开发页面时该类用于在页面上编写自定义调试语句。只有当你已经对页面或整个应用程序启用跟踪时它们才出现。启用跟踪还将有关请求的细节追加到页面,或者,追加到存储在应用程序根目录中的自定义跟踪查看器(如果这样指定)。
⑧.NET Framework和ASP.NET为Web应用程序提供默认授权和验证方案,还可以方便地移除、添加或者替换这些方案,这取决于应用程序的需要。
⑨ASP.NET配置设置存储在基于XML的文件中,这些文件都是人可读和可写的。每一个应用程序都可以有不同的配置文件,可以扩展配置方案,以适应你的要求。
⑩当应用程序安装在同一台计算机上,但使用不同的.NET Framework版本时,就意味着应用程序是并行运行的。
(11)IIS 6.0使用一个称为辅助进程隔离模式的新进程模型,它不同于IIS早期版本中使用的进程模型。当在Windows Server 2003上运行时,默认情况下ASP.NET使用该进程模型。
1.2.2 ASP.NET工作原理
在大多数情况下,可以将ASP.NET页面简单地看成一般的HTML页面,页面上包含标记有特殊功能的一些代码段。当安装.NET时,本地的IIS Web服务器会自动配置以查找扩展名为.aspx的文件,且用ASP.NET模块(名为aspnet_isapi.dll的文件)处理这些文件。
从技术上讲,ASP.NET模块分析ASPX文件的内容,并将文件内容分解成单独的命令以建立代码的整体结构。完成此工作后,ASP.NET模块将各命令放置到预定义的类定义中(不需要放在一起,也不需要按编写顺序放置),然后使用这个类定义一个特殊的ASP.NET对象Page。该对象要完成的任务之一就是生成HTML流,这些HTML流可以返回到IIS,再从IIS返回到客户。简言之,在用户请求IIS服务器提供一个页面时,IIS服务器就根据页面上的文本、HTML和代码(这对我们来说是最重要的)建立该页面。
将ASP、ASP.NET和C#这些术语区分开来是非常重要的。因此在介绍安装和运行ASP.NET之前,要重新对它们进行定义,将它们区分开:
·ASP:用于创建动态Web页面的服务器端技术,它只允许使用脚本语言;
·ASP.NET:用于创建动态Web页面的服务器技术,它允许使用由.NET支持的任何一种功能完善的编程语言;
·C#:本书选用的编程语言,用于在ASP.NET中编写代码。
ASP.NET被描述为一门技术而不是一种语言,这是非常重要的!ASP.NET页面可以用许多语言生成。在此并不需要读者了解这些编程语言,本书也不会讲解它们。本书将选择一种语言,即C#,并利用它介绍ASP.NET。之所以选择C#,是因为它对于初学者来说是最为简单的,而且它可以完成其他.NET语言能够完成的大多数功能。另外,选择C#的最为重要的原因是它随ASP.NET免费提供。因此,当安装ASP.NET时,也就得到了C#。
介绍到这里,你可能会认为只有掌握了C#,才能学习ASP.NET。这听起来是一个令人可怕的学习过程。不过,请不必担心,并不是要你学两种语言。正像在本书开始时介绍的:ASP.NET不是语言,它是一门技术,该技术通过编程语言访问。本书在介绍C#的时候介绍ASP.NET的功能,换言之,将利用C#创建Web页面,利用ASP.NET来驱动它。当然,在系统学习C#之前,本书将从创建动态Web页面的角度介绍它。
总之,ASP.NET是服务器端技术,它允许用户利用功能完善的编程语言创建自己的Web页面。
1.2.3 ASP.NET网页代码模型
ASP.NET网页由以下两部分组成:
·可视元素,包括标记、服务器控件和静态文本;
·页的编程逻辑,包括事件处理程序和其他代码。
ASP.NET提供两个用于管理可视元素和代码的模型,即单文件页模型和代码隐藏页模型。这两个模型功能相同,两种模型中可以使用相同的控件和代码。
在请求ASP.NET页且该页将标记呈现给浏览器的过程中,运行的不仅仅是为该页创建的代码。相反,ASP.NET在运行时会生成并编译一个或多个类来实际执行运行该页所需的任务。本主题概述了在运行时生成的代码。
1.单文件页模型
在单文件页中,标记、服务器元素以及事件处理代码全都位于同一个.aspx文件中。在对该页进行编译时,编译器将生成和编译一个从Page基类派生或从使用@ Page指令的Inherits属性定义的自定义基类派生的新类。例如,如果在应用程序的根目录中创建一个名为SamplePage1的新ASP.NET网页,随后便将从Page类派生一个名为ASP.SamplePage1_ aspx的新类。对于应用程序子文件夹中的页,将使用子文件夹名称作为生成的类的一部分。生成的类中包含.aspx页中控件的声明以及事件处理程序和其他自定义代码。
在生成页之后,生成的类将编译成程序集,并将该程序集加载到应用程序域,然后对该页类进行实例化并执行该页类以将输出呈现到浏览器。如果对影响生成的类的页进行更改(无论是添加控件还是修改代码),则已编译的类代码将失效,并生成新的类。
单文件ASP.NET网页中页类的继承模型,如图1-4所示。

图1-4 ASP.NET网页中页类的继承模型
下面的代码示例演示一个单文件页,此页中包含一个Button控件和一个Label控件,突出显示的部分显示的是script块中Button控件的Click事件处理程序。
<%@ Page Language="C#" %> <script runat="server"> void Button1_Click(Object sender, EventArgs e){ Label1.Text = "Clicked at " + DateTime.Now.ToString();} </script> <html> <head> <title>Single-File Page Model</title> </head> <body> <form runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label"> </asp:Label><br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button"> </asp:Button> </div> </form> </body> </html>
script块可以包含页所需的任意多代码。代码可以包含页中控件的事件处理程序(如该示例所示)、方法、属性及通常在类文件中使用的任何其他代码。在运行时,单文件页被作为从Page类派生的类进行处理。该页不包含显式类声明,但编译器将生成将控件作为成员包含的新类。(并不是所有的控件都作为页成员公开;有些控件是其他控件的子控件。)页中的代码成了该类的一部分,例如,创建的事件处理程序将成为派生的Page类的成员。
2.代码隐藏页模型
在代码隐藏模型中,页的标记和服务器元素(包括控件声明)位于.aspx文件中,而你的页代码则位于单独的代码文件中。该代码文件包含一个分部类,即具有关键字partial(在Visual Basic中为Partial)的类声明,以表示该代码文件只包含构成该页的完整类的全体代码的一部分。在分部类中,添加应用程序要求该页所具有的代码。此代码通常由事件处理程序构成,但也可以包括你需要的任何方法或属性。
代码隐藏页的继承模型比单文件页的继承模型要稍微复杂一些,其模型生成的步骤如下。
步骤1 代码隐藏文件包含一个继承自基页类的分部类。基页类可以是Page类,也可以是从Page派生的其他类。
步骤2 .aspx文件在@ Page指令中包含一个指向代码隐藏分部类的Inherits属性。
步骤3 在对该页进行编译时,ASP.NET将基于.aspx文件生成一个分部类;此类是代码隐藏类文件的分部类。生成的分部类文件包含页控件的声明。使用此分部类,你可以将代码隐藏文件用作完整类的一部分,而无需显式声明控件。
步骤4 最后,ASP.NET生成另外一个在步骤3中生成的类继承的类。生成的第二个类包含生成该页所需的代码。生成的第二个类和代码隐藏类将编译成程序集,运行该程序集可以在浏览器呈现输出。
代码隐藏ASP.NET网页中页类的继承模型,如图1-5所示。
如果你正在处理名为SamplePage的页,则对应的标记位于SamplePage.aspx文件中,而代码位于SamplePage.aspx.vb (Visual Basic)、SamplePage.aspx.cs (C#) 等文件中。
在代码隐藏模型中,前面部分中使用的单文件页示例分成两个部分。标记位于一个文件中(在本示例中为SamplePage.aspx),并且与单文件页类似,代码示例如下:
<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEvent Wireup="true" %> <html> <head runat="server" > <title>Code-Behind Page Model</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label" > </asp:Label> <br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button"> </asp:Button> </div> </form> </body> </html>

图1-5 ASP.NET网页中页类的继承模型
在单文件模型和代码隐藏模型之间,.aspx页有两处差别。第一个差别是,在代码隐藏模型中,不存在具有runat="server"属性的script块(如果要在页中编写客户端脚本,则该页可以包含不具有runat= "server"属性的script块。)。第二个差别是,代码隐藏模型中的@ Page指令包含引用外部文件(SamplePage. aspx.vb或SamplePage.aspx.cs)和类的属性。这些属性将.aspx页链接至其代码。
代码位于单独的文件中。下面的代码示例演示一个与单文件页的示例包含相同Click事件处理程序的代码隐藏文件。
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); } }
代码隐藏文件包含默认命名空间中的完整类声明。但是,类是使用partial关键字进行声明的,这表明类并不整个包含于一个文件中。而在页运行时,编译器将读取.aspx页以及它在@ Page指令中引用的文件,将它们汇编成单个类,然后将它们作为一个单元编译为单个类。
3.选择页模型
单文件页模型和代码隐藏页模型功能相同。在运行时,这两个模型以相同的方式执行,而且它们之间没有性能差异。因此,页模型的选择取决于其他因素,例如,要在应用程序中组织代码的方式、将页面设计与代码编写分开是否重要等。
单文件模型适用于特定的页,在这些页中,代码主要由页中控件的事件处理程序组成。单文件页模型的优点如下:
·在没有太多代码的页中,可以方便地将代码和标记保留在同一个文件中,这一点比代码隐藏模型的其他优点都重要。例如,由于可以在一个地方看到代码和标记,因此研究单文件页更容易;
·因为只有一个文件,所以使用单文件模型编写的页更容易部署或发送给其他程序员;
·由于文件之间没有相关性,因此更容易对单文件页进行重命名;
·因为页面包含于单个文件中,故而在源代码管理系统中管理文件稍微简单一些。代码隐藏页的优点使它们适用于包含大量代码或多个开发人员共同创建网站的 Web应用程序。代码隐藏页模型的优点如下:
·代码隐藏页可以清楚地分隔标记(用户界面)和代码。这一点很实用,可以在程序员编写代码的同时让设计人员处理标记;
·代码并不会向仅使用页标记的页设计人员或其他人员公开;
·代码可在多个页中重用。
1.2.4 ASP.NET 3.5网页模型中的新增功能
ASP.NET 3.5对使用代码隐藏文件创建ASP.NET网页的模型进行了重大更改。
ASP.NET 1.1版支持以下两种ASP.NET网页代码编写模型:单文件模型和代码隐藏模型。在单文件模型中,代码插入到页中具有属性runat="server"的script块中。2.0版和3.5版本仍然支持单文件模型。在代码隐藏模型中,页标记位于.aspx页中,编程代码位于单独的文件中。2.0版和3.5版本对代码隐藏模型进行了重大改进,使该模型更易于使用且更可靠。
1.代码隐藏模型的变化
在ASP.NET 1.1中,ASP.NET页的代码隐藏文件定义一个从Page类派生的类。而.aspx页则反过来表示派生自代码隐藏类的另一个类。代码隐藏类是一个完整的类定义,它包含页中所有控件的实例变量、使用委托的显式事件绑定等。ASP.NET还支持主要用于基于设计器的工具(如Visual Studio 2005)的代码隐藏模型。
在ASP.NET 1.1的代码隐藏模型中,页的标记在.aspx页中维护,代码在一个单独的类文件中维护。.aspx页与其对应的类文件之间的链接在@ Page指令中建立。典型的指令如下所示:
<%@ Page Language="c#" AutoEventWireup="false" Codebehind="SamplePage.aspx.cs" Inherits= "SampleProject.SamplePage"%>
ASP.NET 1.1版还支持代码隐藏模型的以下变体形式:@ Page指令的Codebehind属性被Src属性所替代。
2.ASP.NET 3.5版的代码隐藏模型
ASP.NET 2.0版和3.5版本的代码隐藏模型采用称为分部类的新的语言功能。页的代码隐藏文件并非完整类定义,而只包括所需的应用程序代码,如事件处理程序。代码隐藏分部类无需包含实例变量或显式事件绑定。ASP.NET可以在编译过程中从标记推断控件实例并派生事件绑定。
代码隐藏文件类似于下面的形式:
using System; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(Object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); }
.aspx页与代码隐藏页之间的链接类似于以前的代码隐藏模型所用的链接。但是,@ Page指令使用新的CodeFile属性取代Codebehind或Src属性。此外,该指令还包括一个用于指定页的类名的Inherits属性,如下面的示例所示:
<%@ Page language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEventWireup="true" %>
3.代码隐藏模型的改进
与以前的版本相比,ASP.NET 2.0版和3.5版本中引入的代码隐藏模型提供了以下改进:
·代码隐藏文件更为简单。它仅包含你自己所编写的代码;
·你可以在页中包含控件,而无需在代码隐藏类中为其显式创建实例变量。代码隐藏页必然与标记中声明的控件同步;
·由于可以自声明性控件推断事件绑定,因此你无需在保留的InitializeComponent方法中显式绑定委托。
4.改进了代码与内容的分离
新的代码隐藏模型简化了标记与代码的独立开发。在旧的代码隐藏模型中,如果要在标记中添加控件,必须同时访问代码隐藏页以添加实例变量。在新模型中,无须访问代码隐藏页即可创建页面布局。
1.2.5 ASP.NET应用程序生命周期概述
本主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程序生命周期的代码。在ASP.NET中,若要对ASP.NET应用程序进行初始化并使它处理请求,必须执行一些处理步骤。此外,ASP.NET只是对浏览器发出的请求进行处理的Web服务器结构的一部分。了解应用程序生命周期非常重要,这样才能在适当的生命周期阶段编写代码,达到预期的效果。
ASP.NET应用程序生命周期的各个阶段如表1-1所述。
表1-1 Asp.NET应用程序生命周期的各个阶段及其说明
续表
续表
续表
1.生命周期事件和Global.asax文件
在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为Global.asax的文件。
如果创建了Global.asax文件,ASP.NET会将其编译为从HttpApplication类派生的类,然后使用该派生类表示应用程序。
HttpApplication进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。例如,可以在Global.asax文件中定义一个属性,然后为该属性赋一个特定于请求的值。
通过使用命名约定Application_event(如Application_BeginRequest),ASP.NET可在Global.asax文件中将应用程序事件自动绑定到处理程序。这与将ASP.NET页方法自动绑定到事件(如页的Page_Load事件)的方法类似。
Application_Start和Application_End方法是不表示HttpApplication事件的特殊方法。在应用程序域的生命周期期间,ASP.NET仅调用这些方法一次,而不是对每个HttpApplication实例都调用一次。
表1-2列出了在应用程序生命周期期间使用的一些事件和方法。实际远不止列出的这些事件,但这些事件是最常用的。
表1-2 应用程序生命周期期间使用的事件和方法
2.HTTP模块
ASP.NET应用程序生命周期可通过IHttpModule类进行扩展。ASP.NET包含若干实现IHttpModule的类,如SessionStateModule类。你还可以自行创建实现IHttpModule的类。
如果向应用程序添加模块,模块本身会引发事件。通过使用modulename_eventname约定,应用程序可以在Global.asax文件中预订这些事件。例如,若要处理FormsAuthentication Module对象引发的Authenticate事件,可以创建一个名为FormsAuthentication_Authenticate的处理程序。
默认情况下,ASP.NET中会启用SessionStateModule类。所有会话事件将自动命名为Session_event,如Session_Start。每次创建新会话时都会引发Start事件。
1.2.6 Web窗体语法
1.ASP.NET Web窗体语法元素
ASP.NET Web窗体页是带.aspx文件扩展名的声明性文本文件。除静态内容外,还可以使用八个独特的语法标记元素。本节复习这些语法元素中的每一个并提供示例说明它们的用法。
呈现代码语法:<% %>和<%= %>
代码呈现块由<% ...%>元素表示,允许自定义控件内容显示,并且在Web窗体页执行的呈现阶段执行。下面的示例说明可以如何使用它们在HTML内容上循环。
<% for (int i=0; i<8; i++) { %> <font size="<%=i%>"> Hello World! </font> <br> <% } %>
<%@ Page Language="C#" %> <html> <body> <% for (int i=0; i<8; i++) { %> <font size="<%=i%>"> Hello World! </font> <br> <% } %> </body> </html>
只执行由<% ...%>括起来的代码,但计算包含等号的表达式(<%= ...%>),并将结果显示为内容。因此,<%="Hello World" %>呈现与C#代码<% Response.Write("Hello World");%>相同的内容。
注意:对于使用标记结束或分隔语句的语言(如C#中的分号(;)),根据代码的呈现方式正确放置那些标记很重要。
2.声明代码语法:<script runat="server">
代码声明块定义将编译为生成的Page类的成员变量和方法。这些块可用于创作页/导航逻辑。下面的示例说明如何在<script runat="server">块内声明Subtract方法,然后如何从页中调用此方法。
<script language="C#" runat=server> int subtract(int num1, int num2) { return num1 - num2; } </script> <% ... number = subtract(number, 1); ... %>
<html> <script language="C#" runat=server> int subtract(int num1, int num2) { return num1-num2; } </script>
<body> <% int number = 100; while (number > 0) { Response.Write("值:" + number + "<br>"); number = subtract(number, 1); } %> </body> </html>
注意:与ASP不同(在ASP中,函数可以在<% %>块中声明),所有的函数和全局页变量都必须在<script runat=server>标记中声明。在<% %>块内声明的函数现在将生成语法编译错误。
3.ASP.NET服务器控件语法
自定义ASP.NET服务器控件使页面开发人员能够动态生成HTML用户界面(UI)并响应客户端请求。这些控件在文件内用基于标记的声明语法表示。这些标记不同于其他标记,因为它们包含“runat=server”属性。下面的示例说明可以如何在ASP.NET页内使用<asp:label runat="server">服务器控件。该控件与System.Web.UI.WebControls命名空间中的Label类相对应,默认情况下包括该命名空间。
通过添加ID为“Message”的标记,在运行时创建Label的实例:
<asp:label id="Message" font-size=24 runat="server"/>
然后可用同一名称访问此控件。设置此控件的Text属性的代码行如下:
Message.Text = "Welcome to ASP.NET";
<html> <script language="C#" runat=server> void Page_Load(Object sender, EventArgs e) { Message.Text = "欢迎使用 ASP.NET"; } </script>
<body> <asp:label id="Message" font-size=24 runat=server/> </body> </html>
4.ASP.NET HTML服务器控件语法
HTML服务器控件使页开发人员能够以编程方式操作页内的HTML元素。HTML服务器控件标记因“runat=server”属性而不同于客户端HTML元素。下面的示例说明可以如何在ASP.NET页内使用HTML <span runat=server>服务器控件,与其他服务器控件一样,它也能以编程方式访问方法和属性,如以下示例代码所示:
<script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { Message.InnerHtml = "Welcome to ASP.NET"; } </script> ... <span id="Message" style="font-size:24" runat="server"/>
<html> <script language="C#" runat=server> void Page_Load(Object sender, EventArgs e) { Message.InnerHtml = "欢迎使用 ASP.NET"; } </script> <body> <span id="Message" style="font-size:24" runat=server/> </body> </html>
5.数据绑定语法:<%# %>
ASP.NET中内置的数据绑定支持使页面开发人员能够以分层方式将控件属性绑定到数据容器值。位于<%# %>代码块中的代码只有在其父控件容器的DataBind方法被调用时才执行。下面的示例说明可以如何在<asp:datalist runat=server>控件内使用数据绑定语法。
在数据列表内,指定了一项的模板。用数据绑定表达式指定项模板的内容,并且Container.DataItem引用数据列表MyList所使用的数据源。
<asp:datalist id="MyList" runat=server> <ItemTemplate> Here is a value: <%# Container.DataItem %> </ItemTemplate> </asp:datalist>
本例中,以编程方式设置MyList控件的数据源,然后调用DataBind()。
void Page_Load(Object sender, EventArgs e) { ArrayList items = new ArrayList(); items.Add("One"); items.Add("Two"); items.Add("Three"); MyList.DataSource = items; MyList.DataBind(); }
调用控件的DataBind方法使递归树从此控件开始沿着树向下移动;DataBinding事件在该层次结构的每个服务器控件上引发,并相应的计算控件上的数据绑定表达式。因此,如果调用页的DataBind方法,则将调用页内的每个数据绑定表达式。
<html> <script language="C#" runat=server> void Page_Load(Object sender, EventArgs e) { ArrayList items = new ArrayList(); items.Add("1"); items.Add("2"); items.Add("3"); MyList.DataSource = items; MyList.DataBind(); } </script> <body> <asp:datalist id="MyList" runat=server> <ItemTemplate> 这里有一个值:<%# Container.DataItem %> </ItemTemplate> </asp:datalist> </body> </html>
6.对象标记语法:<object runat="server" />
对象标记使页开发人员能够用基于标记的声明语法声明和创建变量的实例。下面的示例说明如何使用对象标记创建ArrayList类的实例。
<object id="items" class="System.Collections.ArrayList" runat="server"/>
运行时自动创建对象,然后可以通过ID“items”访问此对象。
<html> <object id="items" class="System.Collections.ArrayList" runat=server/> <script language="C#" runat=server> void Page_Load(Object sender, EventArgs e) { items.Add("1"); items.Add("2"); items.Add("3"); MyList.DataSource = items; MyList.DataBind(); } </script> <body> <asp:datalist id="MyList" runat=server> <ItemTemplate> 这里有一个值:<%# Container.DataItem %> </ItemTemplate> </asp:datalist> </body> </html>
7.服务器注释语法:<%--注释--%>
服务器注释使页开发人员能够防止服务器代码(包括服务器控件)和静态内容执行或呈现。下面的示例说明如何阻止内容执行和发送到客户端。注意,<%--和--%>之间的内容将被筛选掉,仅在原始服务器文件中可见,即使其中包含其他ASP.NET指令。
<%@ Page Language="C#"%> <html> <body> 已使用服务器注释对浏览器客户端隐藏了以下内容 (请查看 .aspx 源文件,您就会明白我们的意思:-) <%-- <asp:calendar id="MyCal" runat=server/> <% for (int i=0; i<45; i++) { %> Hello World <br> <% } %> --%> </body> </html>
8.服务器包含语法:<-- #Include File="Locaton.inc" -->
服务器#Includes使页开发人员能够将指定文件的原始内容插入ASP.NET页内的任意位置。下面的示例说明如何将自定义的页眉和页脚插入页中。
<!-- #Include File="Header.inc" --> ... <!-- #Include File="Footer.inc" --> <%@ Page Language="C#"%> <html> <body> <!-- #Include File="Header.inc" --> <p> <h3> 主页面内容</h3> <p> <!-- #Include File="Footer.inc" --> </body> </html>