第一章 建立ASP.NET页面

 

第一章 建立ASP.NET页面

 

主要内容:

ASPNET.NET框架

ASPNET控件简介

ASPNET页面中添加应用逻辑

ASP.NET页面的结构

 

何为表单”?

Web表单页面能够做的事情远远不只是显示标准的HTML表单,可以用它创建具有交互式、动态或数据库驱动的内容的页面。

 

Web表单页面构件

页面是有两个构件组成.

首先,使用ASP.NET控件组装用户界面的动态部分.

第二个构件是应用逻辑.(包括执行代码,或数据库操作代码)

 

1. ASPNET.NET框架

ASPNET.NET框架的一部分,

1.1.    .NET框架类库

1.2.    理解命名空间

.NET的类由(命名空间)组成层次结构.

(相对的,ASP只能访问五个标准类[Response/Request/Session/Application/Server])

名称空间是类的逻辑分组.

名称空间组织成一个层次结构(逻辑树).树根是System名称控件(包含基本数据类型,随机数,日期和时间的类).

1.3.    标准的ASP.Net名称空间

ASPNET页面可以默认地使用一些名称空间(其中包含最常使用的类)中包含的类,其他名称空间必须显示导入.

名称空间

说明

System

包含所有基本数据类型,和其他常用类,如随机数,日期和时间相关类.

System.Collections

用于操作标准集合类型的类(比如散列表和数组列表)

System.Collections.Specialized

包含特殊化集合的类(链表和字符串集合)

System.Configuration

包含用于操作配置文件[Web.config]的类

System.Text

包含用于编码、解码和操作字符串内容的类。

System.Text.RegularExpressions

包含用于执行正则表达式匹配和替换操作的类

System.Web

包含用于使用WWW的基本类,包括表示浏览器请求和服务器响应的类

System.Web.Cache

用于缓存页面内容的类和用于执行自定义缓存操作的类

System.Web.Security

用于实现身份验证和授权的类

System.Web.SessionState

实现会话状态的类

System.Web.UI

建立ASPNET页面的用户界面的基本类

System.Web.UI.HTMLControls

HTML控件的类

System.Web.UI.WebControls

ASPNET控件的类

1.4.    .NET框架兼容的语言

可以使用“支持NET通用语言运行时CLR的任何语言创建ASP.NET页面.

不管使用何种语言,都要认识到:”ASP.NET页面在执行前需要编译.”

在第一次请求ASP.NET页面时,页面被编译成.NET,产生的类文件保存在服务器的特定目录中(Temporary ASP.NET Files,此文件位于你的.NET Framework文件夹的对应版本,例如.NET 2.0下位于这里C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727)

对于每一个每一个ASPNET页面,Temporary ASP.NET Files中都有一个对应的类.对页面的请求,会执行对应的类文件.

ASPNET页面被编译为IL代码.此代码会由即时编译器JIT编译(其实就是在Temporary ASP.NET Files目录中的类文件),并执行它.这个过程是后台自动发生的.

 

ASPNET不支持VBScript.Visual Basic具备VBScript的全部功能.

 

2. ASP.NET控件简介

2.1.    简单的ASP.NET页面

首先展示一个简单的HTML页面.(可以使用记事本程序)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>

    <title>Simple HTML Page</title>

</head>

<body>

<form method="post" action="SimpleHTML.htm">

<b>UserName:</b>

<br /><input name="username" type="text" size="30" />

<p></p>

<b>Comments:</b>

<br /><textarea name="comments" cols="60" rows="10"></textarea>

<p></p>

<input type="submit" value="Add Comment" />

</form>

</body>

</html>

以上页面包含一个简单的HTML表单,其中有一个用户名文本域和一个注释文本域.

这个表单提交到它本身(<form method="post" action="SimpleHTML.htm">)

表单中不包含ASPNET控件.

 

下面,将页面修改为使用ASPNET控件,将表单域转换为智能服务器端表单域.

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="SimpleASPX.aspx.vb" Inherits="SimpleASPX" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Simple ASPX Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <b>UserName:</b>

        <br /><input id="username" type="text" size="30" runat="server" />

        <p></p>

        <b>Comments:

        </b>

        <br /><textarea id="comments" cols="60" rows="10" runat="server"></textarea>

        <p></p>

        <input type="submit" value="Add Comment" runat="server" />

    </div>

    </form>

</body>

</html>

比较两端代码,我们应该注意到有四处修改.

首先,页面的扩展名改为aspx.这样Web服务器才能按照ASP.NET页面加载.

其次,所有表单标记中都添加了[runat=”server”]属性.此属性将标准HTML标记转换为智能服务器端HTML标记.在服务器中打开页面时,有此属性的表单标记现(在服务器上执行),然后在浏览器中显示.

第三,不再使用NAME属性为(表单域命名),而是使用[ID属性为表单域分配一个惟一标识符].使用ID属性是因为不再将表单域看成简单的HTML标记;而是将其转换为服务器端对象.

最后,form标记的修改.必须[在表单域的开始就使用runat=”server”

注意:表单标记转换为ASP.NET,不要使用Method属性,因为此属性是自动包含的.

注意:[默认]情况下,标准HTML表单标记的Method属性值为GET.

Method=”GET”的表单提交时,表单数据作为[查询字符串变量]提交.(不能在查询字符串中传递大量表单数据-具体受限于浏览器,一般不超过10002000个字符.

一般在创建HTML表单时,在表单标记中添加[Method=”POST”属性]

ASP.NET中的表单标记,[默认],Method=”POST”.

如果不指定Action属性,ASP.NET表单控件自动发送回相同页面.

要将标准HTML转换为ASP.NET页面,需要对页面做四处修改:

1) 将文件重命名,扩展名.aspx

2) 每个表单标记添加runat=”server”属性

3) 不使用表单标记的NAME属性,而是使用[ID属性]

4) <form>标记改为<form runat=”server”>

 

ASP.NET页面在后台做了大量复杂的工作,还带来了几种令人兴奋的编程方式.

 

2.2.    ASP.NET控件的优点

使用ASP.NET控件有四个重要的优点:

ASP.NET控件在[一个直观的对象模型中表达HTML元素]

ASPNET控件通过[参与视图状态自动保留它们的属性值]

ASP.NET控件[允许你清晰的分隔页面的设计内容和应用逻辑]

ASP.NET控件[能够维持浏览器兼容性,同时支持高级的浏览器特性,JavaScript]

1. 直观的对象模型

一般情况下,web服务器忽略页面中的HTML标记.Web服务器角度看,这些标记是发送到Web浏览器的无意义字符串;(分析执行页面标记)的工作将由浏览器完成.<b>bold</b>

但是,HTML标记转换为ASP.NET控件后,对于Web服务器来说,这些标记变成[服务器端对象],它具有可以在程序中操作的属性、方法、集合和事件。

HTML标记转为服务器端对象有很多好处。比如:可以通过服务器端代码操作对象的属性;可以编写应用逻辑来读取或修改对象属性;可以通过程序向页面添加新对象或隐藏现有对象。

注意:传统的ASP只能编写从上到下执行的页面;而ASP.NET允许编写代码来响应有某些用户动作引发的事件(事件驱动的编程模型)

2. 视图状态

提交ASP.NET控件所建立的表单时,所有表单域中输入的数据在表单再次出现时都会(保留)。Microsoft将这种自动保留数据的特性称为视图状态(View State)。

ASP.NET控件自动地保留视图状态。

标准的HTML表单,每次都会得到空的表单域。

所有的ASP.NET控件都会自动的保留视图状态。

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    Sub Button_Click(ByVal s As Object, ByVal e As EventArgs)

        entries.InnerHtml = "<hr>" & username.Value & "<p>" & comments.Value & entries.InnerHtml

    End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>清单1-4 GuestBook.aspx</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <b>UserName:</b>

        <br /><input id="username" type="text" size="30" runat="server" />

        <p></p>

        <b>Comments:</b>

        <br /><textarea id="comments" cols="60" rows="10" runat="server"></textarea>

        <p></p>

        <input type="submit" onserverclick="Button_Click" value="增加注释" runat="server" />

        <p></p>

        <span id="entries" runat="server"></span>

    </div>

    </form>

</body>

</html>

通过<span>标记的innerHTML属性,将用户名和注释域的内容添加到<span>标记显示的文本中。

<span>标记的视图状态被保留了下来。(可以通过浏览器查看源码功能查看)

 

视图状态有什么用?

视图状态最重要的作用就是(表单检验)。

 

3. 将代码与内容分离

4. 浏览器兼容性

ASP.NET页面在服务器上执行,而不是在浏览器。

当浏览器请求ASP.NET页面是,会获得标准的HTML页面。

ASP.NET页面可以与任何浏览器兼容。

 

2.3.    ASP.NET控件概述

Web表单添加的ASPNET控件多达50多种。分为两类:

HTML控件

Web控件

1. ASPNET HTML控件

HTML控件是标准HTML标记的服务器端复制品。

 

对于每一个最常见的HTML标记,有一个服务器端HTML控件与之对应。(只需在标记末尾添加runat=”server”属性)

另外,任何不由特殊服务器控件代表的HTML控件可以用HtmlGenericControl表示。

 

HTML控件如何处理新的或者含义模糊的HTML属性?

例如:在标准的HtmlInputText控件中添加名为myAttribute的属性,如下

<input id=”username” type=”text” myAttribute=”39” runat=”server”/>

【这个属性不会造成错误】

 

而如果你在HTML控件中添加一个奇怪的属性,那么显示时,控件只是将此属性的值【原封不动】地传递给Web浏览器。

 

1) HtmlAnchor

用来创建一个服务器端(HTML锚标记)

<a href=”somepage.aspx” runat=”server”>点此</a>

2) HtmlButton

用来创建一个服务器端HTML4.0按钮标记。(一个兼容HTML4.0<button>标记)

【不要将HtmlButtonHTMLInputButton混淆】后者用于创建(表单按钮)。

<button runat=”server”>click Here</button>

3) HtmlForm

用于创建一个服务器端HTML <form>标记。

<form runat=”server”>

4) HtmlGenericControl

为没有HTML控件与之直接对应的HTML标记创建一个服务器控件。

例如:如果使用具有runat=”server”属性的<span><body><marquee>标记,那么就会创建HtmlGenericControl的一个示例:

<span runat=”server”>Hello World!</span>

5) HtmlImage

用于创建一个服务器端<img>标记

<img id=”myImage” src=”smile.gif” runat=”server”/>

6) HtmlInputButton

用于创建一个服务器端<input type=”submit”><input type=reset”><input type=”button”>标记

<input type=”submit” value=”提交” runat=”server”/>

7) HtmlInputCheckBox

用于创建一个服务器端<input type=”checkbox”>标记

<input type=”checkbox” runat=”server”>Do you like this Web Site?

8) HtmlInputFile

用于创建一个服务器端<input type=”file”>标记(接受文件上传)

<input type=”file” runat=”server”>

9) HtmlInputHidden

用于创建一个服务器端<input type=”hidden”>标记

<input type=”hidden” runat=”server”>

10)    HtmlInputImage

创建一个服务器端<input type=”image”>标记

<input type=”image” runat=”server”>

11)    HtmlInputRadioButton

创建一个服务器端表单单选按钮

Geneder?

<br/><input type=”radio” runat=”server”>Male

<br/><input type=”radio” runat=”server”>Female

12)    HtmlInputText

创建一个服务器端<input type=”text”><input type=”password”>标记

Please Login:

UserName:

<input id=”username” type=”text” runat=”server”/>

<p/>

Password:

<input id=”password” type=”password” runat=”server”/>

13)    HtmlSelect

创建一个服务器端HTML <select>标记(用于创建【下拉列表】或【列表框】)

Select your favorite movie:

<select runat=”server”>

<option>Star Wars</option>

<option>Citizen Kane</option>

<option>The Princess Bride</option>

</select>

14)    HtmlTable

创建一个服务器端HTML <table>标记

<table border=1 cellspacing=0 cellpadding=4 runat=”server”/>

15)    HtmlTableCell

创建服务器端Html表格<td>标记(用于创建HTML表格单元格)

<td runat=”server”>Table Data</td>

16)    HtmlTableRow

创建HTML表格<tr>标记(HTML表格行)

<tr runat=”server”>

<td runat=”server”>Table Data1</td>

<td runat=”server”>Table Data 2</td>

</tr>

17)    HtmlTextArea

创建服务器端HTML<textarea>标记(多行的文本输入域)

<textarea cols=”60” rows=”10” runat=”server”></textarea>

 

2. Web控件

所有最常用的HTML标记都可以用HTML控件或Web控件来表达。

注意:

HTML控件都在〖System.Web.UI.HTMLControls名称空间〗中;

Web控件都在〖System.Web.UI.WebControls名称空间〗中。

 

Web控件是标准HTML标记的『更合理』的版本。(标准HTML标记不是处于最合理的状态)

 

注意:在Web控件结尾必须明确添加结束标记(前向斜线 /

<asp:TextBox id=”username” columns=”30” Runat=”server”></asp:TextBox>

或者,可以这样写:

<asp:TextBox id=”username” columns=”30” runat=”server”/>

 

Web控件种类比HTML控件多。可分为五类:

基本的Web控件。大致对应于现有HTML标记。包括TextBoxDropDownListListBox控件。第一组控件如下:

Button

CheckBox

CheckBoxList

DropDownList

HyperLink

Image

ImageButton

Label

ListBox

LinkButton

Panel

PlaceHolder

RadioButton

RadioButtonList

Table

TableCell

TableRow

TextBox

检验web控件。包含用于进行表单验证的控件。这些控件不对应现有的任何HTML标记。

CompareValidator

CustomValidator

RangeValidator

RegularExpressionValidator

RequiredFieldValidator

ValidationSummary

数据控件。用于显示数据库数据,跟ADO.NET有关。

DataGrid

DataList

Repeater

复杂的Web控件。Microsoft提供的两个复杂控件:其一,Calendar控件(显示交互式日历);第二,AdRotator控件(用于显示广告条)

可移动(移动设备)控件。支持移动电话或者PDA

3. ASP.NET页面添加应用逻辑

3.1 处理控件事件

通过将一个子例程(sub)与事件相关联,可以处理控件引发的事件。

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    Sub btnSubmit_Click(ByVal o As Object, ByVal e As EventArgs)

        lblMessage.Text = "你好啊,ASP.NET!"

    End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>无标题页</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <b>程序清单1-5 DisplayMessage.aspx</b>

        <p></p>

        <h1>Click on the button to View the Message:</h1>

        <p></p>

        <asp:Button ID="btnSubmit" Text="click Here" OnClick="btnSubmit_Click" runat="server" />

        <p></p>

        <asp:Label ID="lblMessage" runat="server"></asp:Label>

    </div>

    </form>

</body>

</html>

 

ASPNET页面中声明子例程的方式如下:

Sub btnSubmit_Click(s As Object, e As EventArgs)

End Sub

可以使用第一个参数(Object类型)判断触发子例程的是哪个对象?并且做出相应的响应。

第二个参数是EventArgs类型,其中可以包含被引发的事件所特有的信息。(对于Button,它没有任何属性)

ImageButton控件就能传递有意义的EventArgs参数。

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    Protected Sub ImageButton1_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs)

        Label1.Text = e.X

        Label2.Text = e.Y

        If (e.X > 59 And e.X < 80) And (e.Y > 59 And e.X < 80) Then

            lblMsg.Text = "打中靶心"

        Else

            lblMsg.Text = "笨死了"

        End If

    End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>无标题页</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/Img/i1.JPG" OnClick="ImageButton1_Click" /><br />

        <br />

        x位置:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />

        <br />

        y位置:<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></div>

        <p></p>

        <asp:Label ID="lblMsg" runat="server"></asp:Label>

    </form>

</body>

</html>

 

3.2.    处理页面事件

在『请求ASP.NET页面时』,页面本身会引发几个事件。

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    Sub Page_Init()

        lblMessage.Text &= "<li> Init Event"

    End Sub

   

    Sub Page_Load()

        lblMessage.Text &= "<li> Load Event"

    End Sub

   

    Sub page_prerender()

        lblMessage.Text &= "<li> PreRender Event"

    End Sub

   

    Sub Page_Unload()

        lblMessage.Text &= "<li> Unload Event"

    End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>清单1-8 PageEvent.aspx</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:Label ID="lblMessage" runat="server"></asp:Label>

    </div>

    </form>

</body>

</html>

注意:Page_Unload子例程的消息不被显示的原因是【Unload事件在浏览器显示完所有内容之后才发生。】

最有用的页面事件是Load事件。(可以在这里对页面中的变量和控件状态,进行初始化。

 

注意:Random类是System名称空间的一部分。(可参考.NET Framework SDK文档)

Dim ran_num As New Random

        Dim i As Integer

        For i = 0 To 10

            lblMessage.Text &= ran_num.Next(1, 11) & ", "

        Next

其中ran_num.Next(1, 11)会返回110之间的随机数。

 

Load事件在引发任何控件事件之前被引发。

PreRender事件在引发任何控件事件之后被引发。

 

IsPostBack属性

使用Page.IsPostBack属性,表示Load事件仅在第一次装载页面时执行代码。

 

Page控件对象在页面中是默认的。

 

4. ASP.NET页面的结构

下面列出ASP.NET页面的重要元素的列表:

指令

代码声明块

ASP.NET控件

代码显示块

服务器端注释

服务器端包含指令

文本和HTML标记

 

4.1 指令directive

指令控制如何编译ASP.NET页面。(编译指令?)

指令:以<%@开头,以%>结尾。

可以出现在页面任何位置。(但是按惯例,一般在页面的顶部。)

指令分两类:即【页面指令】和【导入指令】

1. 页面指令

功能包括:指定默认的编程语言;为页面启用跟踪和调试。

 

指定页面语言:<%@ Page Language=”C#” %>

上面指令中的Page关键字是可选的(没有也可以)

 

跟踪指令Trace

启用跟踪功能<%@ Page Trace=”True” %>之后,你可以使用Trace类的两个方法(WriteWarn)来跟踪信息。

<%@ Page Language="VB" Debug="true" trace="true" %><%--只能有一个Page指令--%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    Sub page_load()

        Dim strTraceMessage As String

        Trace.Warn("Page_load Event Executing!")

        strTraceMessage = "Hello world!"

        Trace.Write("the value of strTraceMessage is " & strTraceMessage)

    End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Trace.aspx</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <h2>Testing Page Trace</h2>

    </div>

    <% Trace.Warn("Rendering Page Content!")%>

    <% Trace.Write("Hello")%>

    </form>

</body>

</html>

 

注意:要在页面上显示【运行时错误消息】,需要用到Debug指令(Page的一部分)。

 

Asp.NET页面中包含以下指令:

<%@ Page Debug=”true” %>(注意值true用引号包裹)

要想启用跟踪功能则要包含Trace指令,如下:

<%@ Page Trace=”true”%>

最好,要注意的是,一个页面只能有一个Page指令,但是以上指令可以组合在一句。

2.导入指令

默认时,ASP.NET页面只能自动导入几个常用名称空间。

 

或者,也可以对类使用完全限定名称。

 

4.2 代码声明块

代码声明块,包含ASP.NET页面的所有应用逻辑和所有全局变量声明、子例程和函数。

必须出现在<Script Runat=”server”>标记中。

 

<Script Runat=”server”>标记接受两个可选的属性。

首先,可以指定使用的语言:<Scipt Language=”C#” runat=”server”>(默认语言是VB

第二个可选属性是SRC。用来指定包含代码块的外部文件。<Script runat=”server” SRC=”d.aspx”/>

 

4.3 ASP.NET控件

控件可以随意地散步在页面的(文本和HTML内容之间)。但是要求【控件应该出现在<form runat=“server”>标记内】。

 

对于某些标记(如<span runat=”server”><ASP:Label runat=”server”/>)可以不出现在【form】段。

 

ASP.NET限定『一个页面只能包括一个form

4.4 代码显示块(code render block)

用于『在ASP.NET页面的HTML或文本内容中执行代码』

有两种:内嵌代码(inline code)和内嵌表达式(inline expression)

 

内嵌代码:执行一个或一系列语句。语句开头是字符<%,结尾是%>

内嵌表达式:显示变量或方法的值。(这种代码是Response.Write的缩写形式),开头是<%=,结尾是%>

 

注意:可以在【代码显示块】内使用代码声明块来声明变量。但是,此变量是被限定了使用范围的。

 

4.5 服务器端注释

通过服务器端注释(server-side comment)向页面添加注释。

注释的开头字符<%--,结尾--%>

目的是对代码进行说明。

注意:不能用浏览器的View source来查看此注释。

 

4.6 服务器端包含指令

使用服务器端包含指令(server-side include directive)可以将一个文件包含在ASP.NET页面中。

指令有两种形式:在当前目录或子目录<!--#INCLUDE file=”includefile.aspx”-->

或者提供完整路径<!--#INCLUDE virtual=”/mydir/include.aspx”-->

 

不能使用变量来指定要包含的文件路径。(这是错误的)<!-- #INCLUDE file”<%=myval%>” -->

 

如果不使用包含指令,可以用【用户控件】来代替。

 

4.7 文本和HTML标记

可以包含在ASP.NET中的元素还有HTML内容。

一般的HTML标记和文本构成了页面的静态部分。

 

页面中的HTML内容会【随其他元素一起编译】。页面中的HTML内容由【LiternalControl类】表示。

可以使用LiternalControl类的Text属性操作页面中的纯HTML部分。

 

 

 

posted @ 2009-03-09 10:48  怒杀神  阅读(384)  评论(0编辑  收藏  举报