第二章(1)WEB 页面简介

摘要:在这一章中,我们对Web Form 页面进行了介绍,通过几个实例,我们分别介绍了Server 控件,HTML Server 控件,以及Web Form的事件模型。在下面的章节中,我们将对本章所涉及的概念进行更深入的讲解。

ASP.NET基础教程-第二章 (1)WEB 页面简介

2.1.1 WEB FORM
表单,英文单词是Form,学习过VB的朋友一定不会陌生。在MS.NET架构里,Form是一个经常使用到的词汇。比如:编写Windows 应用时会提到Windows Form,编写Web 应用时会提到Web Form。Windows Form可以看作一个Windows窗体,这和在VB里面一样。而Web Form则代表了一个一个的Web页面。总的看来,Form就像是一个容纳各种控件的容器,各种控件都必须直接或者间接的和它有依存关系。Form在这里译作"WEB表单"似乎有些不妥。"表单"这个词,在WEB程序员看来,总是和HTML里面的"Form"相混淆。"WEB表单"似乎翻译成"WEB页面"更加妥当一些。
大家还记得VB里面的Form实际上就是一个对象吧,它可以有自己的属性、方法、事件等等。WEB表单,或者说WEB页面,实际上是一个"对象" (Object)。MS.NET架构里面一个比较重要的概念就是"对象":所有的控件都是对象,甚至数据类型都成了对象;每种数据类型都有自己特有的属性和方法。我们在后面的编程中将可以体会到。
WEB FORM的后缀名是ASPX。当一个浏览器第一次请求一个ASPX文件时,WEB FORM页面将被CLR(common language runtime)编译器编译。此后,当再有用户访问此页面的时候,由于ASPX页面已经被编译过,所以,CLR会直接执行编译过的代码。这和ASP的情况完全不同。ASP只支持VBScript和JavaScript这样的解释性的脚本语言。所以ASP页面是解释执行的。当用户发出请求后,无论是第一次,还是第一千次,ASP的页面都将被动态解释执行。而asp.net支持可编译的语言,包括VB.NET、C#、Jscript.NET等。所以,asp.net是一次编译多次执行。
为了简化程序员的工作,ASPX页面不需要手工编译,而是在页面被调用的时候,由CLR自行决定是否编译。一般来说,下面两种情况下,ASPX会被重新编译:
1.ASPX页面第一次被浏览器请求;
2.ASPX被改写
由于ASPX页面可以被编译,所以ASPX页面具有组件一样的性能。这就使得ASPX页面至少比同样功能的ASP页面快250%!
下面我们来看一下简单的WEB页面。
2.1.2 我的第一个Page
把下面的代码拷贝到myfirstpage.aspx文件中,然后从浏览器访问这个文件:
<!--源文件:form\web页面简介\myfirstpage.aspx-->
<form action="myfirstpage.aspx" method="post">

<h3> 姓名: <input id="name" type=text>

所在城市: <select id="city" size=1>
<option>北京</option>
<option>上海</option>
<option>重庆</option>
</select>

<input type=submit value="查询">

</form>
你可能觉得这个页面太简单了,用HTML就可以完成。是的!微软建议你将所有的文件哪怕是纯HTML文件都保存为ASPX文件后缀,这样可以加快页面的访问效率!不仅仅是在asp.net环境中,在IIS5.0以后的ASP3.0就已经支持这个特性了。
由于我们没有对表单提交做任何响应,所以,当你按下"查询"按钮,页面的内容没有什么改变。
下面我们将逐步使用asp.net的思考方式,来完成我们的页面。
2.1.3 WEB页面处理过程
这一节我们将深入到asp.net内部,看看页面是怎样被处理的。
和所有的服务器端进程一样,当ASPX页面被客户端请求时,页面的服务器端代码被执行,执行结果被送回到浏览器端。这一点和ASP并没有太大的不同。
但是,asp.net的架构为我们做了许多别的事情。比如,它会自动处理浏览器的表单提交,把各个表单域的输入值变成对象的属性,使得我们可以像访问对象属性那样来访问客户的输入。它还把客户的点击映射到不同的服务器端事件。
了解WEB页面的处理过程很重要。这样你可以仔细地优化你的代码,提高代码的效率。
2.1.3.1 页面的一次往返处理
用户对Server Control的一次操作,就可能引起页面的一次往返处理:页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端。
正因为每个Control都可能引发一次页面的服务器端事件,所以,asp.net尽量减少了控件的事件类型。很多组件都只有OnClick事件。特别的,asp.net不支持服务器端的OnMouseOver事件。因为OnMouseOver事件发生得非常频繁。所以,支持服务器端的OnMouseOver事件是非常不现实的。
2.1.3.2 页面重建
每一次页面被请求,或者页面事件被提交到服务器,asp.net运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。当下一次页面被处理时,asp.net运行环境是不知道它的上一次执行情况的。在这个意义上,ASPX页面是没有状态的。这也是HTTP协议的特点(为了加速页面的访问,在asp.net页面里面可以使用缓存机制,也就是保存页面的执行结果,下一次页面被请求时,直接送回上一次的执行结果。)。
在ASP中,当页面被提交到服务器端时,只有那些用户输入的值被传递到服务器。其他的比如组件的属性、变量的值,是不会传递的。所以服务器无法了解组件的进一步的信息。
在asp.net中,页面对象的属性、页面控件的属性被称为"view state"(页面状态)。页面状态在asp.net中被受到特别关照。请看服务器端(page1.aspx)的代码:
<!--源文件:form\web页面简介\page1.aspx-->
<HTML>
<BODY>
<SCRIPT language="VB" runat="server">
Sub ShowValues(Sender As Object, Args As EventArgs)
divResult.innerText = "You selected '" _
& selOpSys.value & "' for machine '" _
& txtName.value & "'."
End Sub
</SCRIPT>
<DIV id="divResult" runat="server">
</DIV>
<FORM runat="server">
机器名:
<INPUT type="text" id="txtName" runat="server">
<P />
操作系统:
<select id="selOpSys" size="1" runat="server">
<OPTION>Windows 95</OPTION>
<OPTION>Windows 98</OPTION>
<OPTION>Windows NT4</OPTION>
<OPTION>Windows 2000</OPTION>
</SELECT>
<P />
<INPUT type="submit" value="Submit" runat="server" onserverclick="ShowValues">
</FORM>
</BODY>
</HTML>

运行后将自动被解释成客户端代码,如下:
<HTML>
<BODY>
You selected 'Windows 98' for machine 'iceberg'.
<FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0">
<INPUT type="hidden" name="__VIEWSTATE" value="a0z1741688109__x">
机器名:
<INPUT type="text" id="txtName" name="txtName" value="tizzy">
<P />
操作系统:
<SELECT id="selOpSys" size="1" name="selOpSys">
<OPTION value="Windows 95">Windows 95</OPTION>
<OPTION selected value="Windows 98">Windows 98</OPTION>
<OPTION value="Windows NT4">Windows NT4</OPTION>
<OPTION value="Windows 2000">Windows 2000</OPTION>
</SELECT>
<P />
<INPUT type="submit" value="Submit">
</FORM>
</BODY>
</HTML>

对于上面的代码,服务器端控件能在服务器端脚本中被自由运用。如果我们用传统的ASP代码实现上述的功能的话:
If Len(Request.Form("selOpSys")) > 0 Then
StrOpSys = Request.Form("selOpSys")
StrName = Request.Form("txtName")
Response.Write("You selected '" & strOpSys _
& "' for machine '" & strName & "'.")
End If

如果我们用asp.net的话,程序代码如下:
If Len(selOpSys.value) > 0 Then
Response.Write("You selected '" & selOpSys.value _
& "' for machine '" & txtName.value & "'.")
End If
通过上面例子不难看出:asp.net页面具有组件方式的方便性和灵活性。
请注意:asp.net通过把页面的状态封装到一个隐藏的输入域,从而可以在不同的页面之间实现传递页面的状态。
另外,asp.net也支持应用程序一级的状态管理。这个特性在ASP中就已经实现。
2.1.3.3 页面处理内部过程
我们来看看页面处理的内部过程。下面的过程是依次进行的:
2.1.3.3.1 Page_load
首先,页面的状态被恢复,然后触发Page_OnLoad事件。在这个过程中,你可以读取或者重置页面的属性和控件的属性,根据IsPostBack属性判定页面是否为第一次被请求,执行数据绑定,等等。
现在我们通过一个具体的例子,来详细讲述Page_load事件:
我们所做的这个例子关于用户登录的。
我们先来看page.aspx的代码:
<!--源文件:form\web页面简介\page.aspx-->
<%@ Register TagPrefix="Acme" TagName="Login" Src="page.ascx" %>
<html>
<title>登录演示</title>
<script language="VB" runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
If (Page.IsPostBack)
MyLabel.Text &= "用户名:" & MyLogin.UserId & "<br>"
MyLabel.Text &= "密码: " & MyLogin.Password & "<br>"
End If
End Sub
</script>
<body style="font: 10pt verdana">
<center> <h3>登录</h3></center>
<form runat="server">
<Acme:Login id="MyLogin" UserId="" Password="" BackColor="beige" runat="server"/>
</form>
<asp:Label id="MyLabel" runat="server"/>
</body>
</html>
在这个文件中,我们使用了Page_OnLoad事件的IsPostBack属性,用来显示用户登录时的用户名和密码。
在来看一下page.ascx文件:
<!--源文件:form\web页面简介\page.ascx-->
<script language="VB" runat="server">
Public BackColor As String = "white"
Public Property UserId As String
Get
Return UserName.Text
End Get
Set
UserName.Text = Value
End Set
End Property
Public Property Password As String
Get
Return Pass.Text
End Get
Set
Pass.Text = Value
End Set
End Property
</script>
<center>
<table style="background-color:<%=BackColor%>;font: 10pt verdana;border-width:1;
border-style:solid;border-color:black;" cellspacing=15>
<tr>
<td><b>用户名: </b></td>
<td><ASP:TextBox id="UserName" runat="server"/></td>
</tr>
<tr>
<td><b>密码: </b></td>
<td><ASP:TextBox id="Pass" TextMode="Password" runat="server"/></td>
</tr>
<tr>
<td></td>
<td><ASP:Button Text="提交" runat="server"/></td>
</tr>
</table>
</center>
在这个文件中,我们设置了控件的属性。使之能在page.aspx中调用程序的运行如图:

在下一个例子中,我们将使用Page_OnLoad事件,来执行数据绑定:
文件databind.aspx代码如下:
<!--源文件:form\web页面简介\databind.aspx-->
<html>
<head>
<title>数据绑定演示</title>
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then
Dim values as ArrayList= new ArrayList()
values.Add ("北京")
values.Add ("上海")
values.Add ("杭州")
values.Add ("成都")
values.Add ("重庆")
values.Add ("西安")
DropDown1.DataSource = values
DropDown1.DataBind
End If
End Sub
'定义按钮的单击事件
Sub SubmitBtn_Click(sender As Object, e As EventArgs)
'结果显示
Label1.Text = "你选择的城市是: " + DropDown1.SelectedItem.Text
End Sub
</script>
</head>
<body>
<center><h3><font face="Verdana">数据绑定演示</font></h3></center>
<form runat=server>
<center><asp:DropDownList id="DropDown1" runat="server" /></center>
<center><asp:button Text="提交" OnClick="SubmitBtn_Click" runat=server/></center>
<p>
<center><asp:Label id=Label1 font-name="Verdana" font-size="10pt" runat="server" /></center>
</form>
<body>
</html>

程序运行效果如图:
当我们点击"提交"按钮时:

在下面的例子中,我们将用page_load事件来对数据库进行连接:
我们还要说明的是如果使用SQL语句对数据库进行操作的时候,就需要在页面中导入System.Data 和 System.Data.SQL 名字控件,文件pagedata.aspx的代码如下:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>

程序代码如下(pagedata.aspx):
<!--源文件:form\web页面简介\pagedata.aspx-->
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>
<script language="VB" runat="server">
Sub Page_Load(Src As Object, E As EventArgs)
Dim DS As DataSet
Dim MyConnection As SQLConnection
Dim MyCommand As SQLDataSetCommand
'同数据库进行连接,采用sql server数据库
MyConnection = New SQLConnection("server='iceberg';uid=sa;pwd=;database=info")
'执行SQL操作
MyCommand = New SQLDataSetCommand("select * from infor",MyConnection)
DS = New DataSet()
MyCommand.FillDataSet(ds, "infor")
MyDataGrid.DataSource=ds.Tables("infor").DefaultView
MyDataGrid.DataBind()
End Sub
</script>
<center>
<body>
<h3><font face="Verdana">Page_load事件演示</font></h3>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="600"
BackColor="white"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
MaintainState="false"
/>
/body>
</center>
</html>

在这个程序中,我们在page_load事件中,我们做了哪些事呢?
① 与数据库连接。在这个例子中,我们使用SQL Server作为后台数据库。在这个库中,我们建立了info数据库,在数据库中有一张infor表。
② 执行SQL操作
③ 将筛选后的数据显示出来
我们再来看看程序运行的效果:

上面就是对Page_load事件的介绍,相信大家通过例子能对该事件有个理解。
2.1.3.3.2 事件处理
这一阶段处理表单的事件。你可以处理特定的事件,也可以在表单需要校验的情况下,根据IsValid属性判定页面的输入是否有效。
Web Form提供了一些具有验证功能的服务器控件。这些控件提供了一套简单易用并且很强大的功能能检查输入时是否有错误。而且,还能显示提示信息给用户。
对于每个控件来说,都有一特定的属性,来验证输入的值是否有效。我们来看一下对输入控件需要验证的属性:

 


控件
需要验证的属性

HtmlInputText
Value

HtmlTextAreaHtm
Value

HtmlSelect
Value

HtmlInputFile
Value

TextBox
Text

ListBox
SelectedItem

DropDownList
SelectedItem

RadioButtonList
SelectedItem

好了,有了上面的介绍,我们就以例子来讲解表单的有效性验证。
在下面一个简单的例子中,我们将对用户的输入验证。
如Validate.aspx 的内容如下:
<!--源文件:form\web页面简介\validate.aspx-->
<html>
<head>
<script language="VB" runat="server">
Sub ValidateBtn_Click(sender As Object, e As EventArgs)
If (Page.IsValid) Then
lblOutput.Text = "页面有效!"
Else
lblOutput.Text = "在页面中不能出现空项!"
End If
'判断是否输入为数字
if not isnumeric(TextBox1.text) then
lbloutput.text="请输入数值!"
End if
End Sub
</script>
</head>
<body>
<center><h3><font face="Verdana">验证表单的例子</font></h3></center>
<p>
<form runat="server">
<title>表单验证</title>
<center>
<table bgcolor="white" cellpadding=10>
<tr >
<td colspan=3>
<asp:Label ID="lblOutput" Text="请填写下面的内容" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat=server /><br>
</td>
</tr>
<tr>
<td align=right>
<font face=Verdana size=2>储蓄卡类型:</font>
</td>
<td>
<ASP:RadioButtonList id=RadioButtonList1 RepeatLayout="Flow" runat=server>
<asp:ListItem>绿卡</asp:ListItem>
<asp:ListItem>牡丹卡</asp:ListItem>
</ASP:RadioButtonList>
</td>
<td align=middle rowspan=1>
<asp:RequiredFieldValidator id="RequiredFieldValidator1"
ControlToValidate="RadioButtonList1"
Display="Static"
InitialValue="" Width="100%" runat=server>
*
</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align=right>
<font face=Verdana size=2>卡号:</font>
</td>
<td>
<ASP:TextBox id=TextBox1 runat=server />
</td>
<td>
<asp:RequiredFieldValidator id="RequiredFieldValidator2"
ControlToValidate="TextBox1"
Display="Static"
Width="100%" runat=server>
*
</asp:RequiredFieldValidator>
</td>
</tr>
<td>
</tr>
<tr>
<td></td>
<td>
<ASP:Button id=Button1 text="验证" OnClick="ValidateBtn_Click" runat=server />
</td>
<td></td>
</tr>
</table>
</center>
</form>
</body>
</html>

我们对验证按钮的OnClick事件进行编程,其中用到了IsNumeric()函数,用来判断变量是否为数值型的。我们还可以用IsData()函数对输入的日期进行判断。IsData()接受的合法日期为100年1月1日到9999年12月31日。
运行如图:

当我们在卡号一栏中输入一些字母,而不是数值时,页面上将会提示你输入数值。
让我们再举一个很有用的验证应用:
当用户在填写个人信息的时候,往往需要输入身份证号,那么我们是如何进行身份证号的验证呢?
要解决这个问题,首先,让我们先看看我国的身份证号是如何编码的。
1 2 3 4 5
XX XXXX XXXXXX XX X (这个是没有升位以前的一个身份证号码的组成方式)
1 省 2 地市 3 生日 4 顺序码 5 性别
在这个例子中,我们只对省份进行判断。
身份编码一览表:

北京
吉林 22
福建 35
广东 44
云南 53

天津 12
黑龙江 23
江西 36
广西 45
西藏 54

河北 13
上海 31
山东 37
海南 46
陕西 61

山西 14
江苏 32
河南 41
重庆 50
甘肃 62

内蒙古 15
浙江 33
湖北 42
四川 51
青海 63

辽宁 21
安徽 34
湖南 43
贵州 52
宁夏 64

新疆 65
台湾 71
香港 81
澳门 82
国外 91

在这个程序中,仅仅作了一个简单的判断
Validate1.aspx的文件内容如下:
<!--源文件:form\web页面简介\validate1.aspx-->
<html>
<head>
<script language="VB" runat="server">
Sub ValidateBtn_Click(sender As Object, e As EventArgs)
If (Page.IsValid) Then
lblOutput.Text = "页面有效!"
Else
lblOutput.Text = "在页面中不能出现空项!"
End If
If not isnumeric(TextBox1.text) then
bloutput.text="请输入数值!"
End if
'在这里我们只作了一个简单的判断。使用了left$()函数
if left$(textbox1.text,2)<>"11" then
lbloutput.text="请验证你的身份证输入"
End if
End Sub
</script>
</head>
<body>
<center><h3><font face="Verdana">验证表单的例子</font></h3></center>
<p>
<form runat="server">
<title>表单验证</title>
<center>
<table bgcolor="white" cellpadding=10>
<tr >
<td colspan=3>
<asp:Label ID="lblOutput" Text="请填写下面的内容" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat=server /><br>
</td>
</tr>
<tr>
<td align=right>
<font face=Verdana size=2>身份证号:</font>
</td>
<td>
<ASP:TextBox id=TextBox1 runat=server />
</td>
<td>
<asp:RequiredFieldValidator id="RequiredFieldValidator2"
ControlToValidate="TextBox1"
Display="Static"
Width="100%" runat=server>
*
</asp:RequiredFieldValidator>
</td>
</tr>
<td>
</tr>
<tr>
<td></td>
<td>
<ASP:Button id=Button1 text="验证" OnClick="ValidateBtn_Click" runat=server />
</td>
<td></td>
</tr>
</table>
</center>
</form>
</body>
</html>
在这个程序中,我们仅对北京地区的身份证号进行了验证,我们使用Left$()函数把字符串的前两个字符取出进行比较。如果大家感兴趣的话,可以把这个程序补充完整。
程序的运行如图:

这是输入正确的情况,如输入不正确,则显示(如图):

我们在验证的时候,有时需要进行特殊的验证。在下面的表中,列出了需要进行特殊验证时要使用的特殊控件。

控件
描述

RequiredFieldValidator  使用户在输入时,不是使这一项为空

CompareValidator
对两个控件的值进行比较

RangeValidator
对输入的值进行控制,使其值界定在一定范围内

RegularExpressionValidator
把用户输入的字符和自定义的表达式进行比较

CustomValidator
自定义验证方式

ValidationSummary
在一个页面中显示总的验证错误


现在对各个验证控件介绍:

1. RequiredFieldValidator

下面的这个例子,演示了RequiredFieldValidator控件的使用方法。
validate3.aspx文件:
<!--源文件:form\web页面简介\validate3.aspx-->
<html>
<body>
<center>
<title>验证控件演示 (1)</title>
<h3><font face="Verdana">验证控件演示 (1)</font></h3>
<form runat=server>
姓名: <asp:TextBox id=Text1 runat="server"/>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" ControlToValidate="Text1" Font-Name="Arial" Font-Size="11" runat="server">
此项不能为空!
</asp:RequiredFieldValidator>
<p>
<asp:Button id="Button1" runat="server" Text="验证" />
</form>
</center>
</body>
</html>
当我们不在文本框中输入内容的时候,页面上将会出现不能为空的提示。

程序运行如下:

2.CompareValidator 控件 为了比较两个控件的值,此时我们需要使用CompareValidator 控件。
在下面的这个例子中,我们将讲解CompareValidator 控件的用法。
先看文件validata4.aspx:
<!--源文件:form\web页面简介\validate4.aspx-->
<%@ Page clienttarget=downlevel %>
<html>
<title>CompareValidator控件示例</title>
<head>
<script language="VB" runat="server">
Sub Button1_OnSubmit(sender As Object, e As EventArgs)
If Page.IsValid Then
lblOutput.Text = "比较正确!"
Else
lblOutput.Text = "比较不正确!"
End If
End Sub
Sub lstOperator_SelectedIndexChanged(sender As Object, e As EventArgs)
comp1.Operator = lstOperator.SelectedIndex
comp1.Validate
End Sub
</script>
</head>
<body>
<center>
<h3><font face="Verdana">CompareValidator控件示例</font></h3>
<form runat=server>
<table bgcolor="#eeeeee" cellpadding=10>
<tr >
<td>
<h5><font face="Verdana">字符串 1:</font></h5>
<asp:TextBox Selected id="txtComp" runat="server"></asp:TextBox>
</td>
<td>
<h5><font face="Verdana">比较运算符:</font></h5>
<asp:ListBox id="lstOperator" OnSelectedIndexChanged="lstOperator_SelectedIndexChanged" runat="server">
<asp:ListItem Selected Value="Equal" >=</asp:ListItem>
<asp:ListItem Value="NotEqual" ><></asp:ListItem>
<asp:ListItem Value="GreaterThan" >></asp:ListItem>
<asp:ListItem Value="GreaterThanEqual" >>=</asp:ListItem>
<asp:ListItem Value="LessThan" ><</asp:ListItem>
<asp:ListItem Value="LessThanEqual" >=<</asp:ListItem>
</asp:ListBox>
</td>
<td>
<h5><font face="Verdana">字符串 2:</font></h5>
<asp:TextBox id="txtCompTo" runat="server"></asp:TextBox><p>
<asp:Button runat=server Text="验证" ID="Button1" οnclick="Button1_OnSubmit" />
</td>
</tr>
</table>
<asp:CompareValidator id="comp1" ControlToValidate="txtComp" ControlToCompare = "txtCompTo" Type="String" runat="server"/>
<br>
<asp:Label ID="lblOutput" Font-Name="verdana" Font-Size="10pt" runat="server"/>
</form>
</center>
</body>
</html>
在上面的代码中,我们实现了对两个控件的值进行比较。
程序运行如下:
当我们在两个文本框中输入值,然后选定运算符后,点验证按钮后,在页面上将显示

比较结果::

3.RangeValidator控件 RangeValidator控件主要界定输入的值的范围。因为有时我们要求输入的值是要有一定范围的,所以我们要使用RangeValidator来判断。
在下面的这个例子中,我们将来介绍RangeValidator控件。
请看validata5.aspx的程序内容:
<!--源文件:form\web页面简介\validate5.aspx-->
<%@ Page clienttarget=downlevel %>
<html>
<center>
<title>RangeValidator控件演示</title>
<head>
<script language="VB" runat="server">
Sub Button1_Click(sender As Object, e As EventArgs)
If (Page.IsValid) Then
lblOutput.Text = "结果正确!"
Else
lblOutput.Text = "结果不正确!"
End If
End Sub
Sub lstOperator_SelectedIndexChanged(sender As Object, e As EventArgs)
rangeVal.Type = lstType.SelectedIndex
rangeVal.Validate
End Sub
</script>
</head>
<body>

<h3><font face="Verdana">RangeValidator控件演示</font></h3>
<p>
<form runat="server">
<table bgcolor="#eeeeee" cellpadding=10>
<tr >
<td>
<h5><font face="Verdana">输入要验证的值:</font></h5>
<asp:TextBox Selected id="txtComp" runat="server"/>
</td>
<td>
<h5><font face="Verdana">数据类型:</font></h5>
<asp:DropDownList id="lstType" OnSelectedIndexChanged="lstOperator_SelectedIndexChanged" runat=server>
<asp:ListItem Selected Value="String" >String</asp:ListItem>
<asp:ListItem Value="Integer" >Integer</asp:ListItem>
</asp:DropDownList>
</td>
<td>
<h5><font face="Verdana">最小值:</font></h5>
<asp:TextBox id="txtMin" runat="server" />
</td>
<td>
<h5><font face="Verdana">最大值:</font></h5>
<asp:TextBox id="txtMax" runat="server" /><p>
<asp:Button Text="验证" ID="Button1" οnclick="Button1_Click" runat="server" />
</td>
</tr>
</table>
<asp:RangeValidator id="rangeVal" Type="String" ControlToValidate="txtComp" MaximumControl="txtMax" MinimumControl="txtMin" runat="server"/>
<br>
<asp:Label id="lblOutput" Font-Name="verdana" Font-Size="10pt" runat="server" />
</form>
</body>
</center>
</html>
当我们在三个文本框中分别输入要验证的值,最大值,和最小值,然后按下验证按钮,页面上将显示判断的结果。
在本例中我们只能比较integer和string的值,当然,我们也可以增加数据类型,如double型,float型,date型,currency型等。
结果运行如下:

4. RegularExpressionValidator控件 我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因为用户有可能输入各式各样的信息,而有些不符合要求的数据会给我们的后端ASP处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题。因此我们在将这些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据的合法性校验,以便后面的程序可以安全顺利的执行。 使用RegularExpressionValidator服务器控件,可以用来检查我们输入的信息是否和我们的自定义的表达式一致。比方说用它可以检查e-mail地址,电话号码等合法性。 在讲述RegularExpressionValidator服务器控件使用之前,我们先来了解一下正则表达式(RegularExpression)的来源: 正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
其实,正则表达式(RegularExpression)是一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
使用正则表达式,就可以:
1. 测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
2. 替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
3. 根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。
另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。VBScript 是 Visual Basic 的一个子集,具有丰富的字符串处理功能。与 C 类似的 Visual Basic Scripting Edition 则没有这一能力。正则表达式给 Visual Basic Scripting Edition 的字符串处理能力带来了明显改善。不过,可能还是在 VBScript 中使用正则表达式的效率更高,它允许在单个表达式中执行多个字符串操作。
正是由于"正则表达式"的强大功能,才使得微软慢慢将正则表达式对象移植到了视窗系统上面。在书写正则表达式的模式时使用了特殊的字符和序列。下表描述了可以使用的字符和序列,并给出了实例。
字符描述: \:将下一个字符标记为特殊字符或字面值。例如"n"与字符"n"匹配。"\n"与换行符匹配。序列"\\"与"\"匹配,"\("与"("匹配。 
^ :匹配输入的开始位置。 
$ :匹配输入的结尾。 
* :匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。 
+ :匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。 
? :匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。 
.:匹配换行符以外的任何字符。 
(pattern) 与模式匹配并记住匹配。匹配的子字符串可以从作为结果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括号字符(和 ),可使用"\(" 或 "\)"。 
x|y:匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。
{n}:n 为非负的整数。匹配恰好n次。例如,"o{2}" 不能与 "Bob 中的 "o" 匹配,但是可以与"foooood"中的前两个o匹配。 
{n,} :n 为非负的整数。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。"o{0,}"等价于"o*"。 
{n,m} :m 和 n 为非负的整数。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三个o。"o{0,1}"等价于"o?"。 
[xyz] :一个字符集。与括号中字符的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。 
[^xyz] :一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]" 可以匹配"plain"中的"p". 
[a-z] :表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。 
[^m-z] :否定的字符区间。与不在指定区间内的字符匹配。例如,"[m-z]"与不在"m"到"z"之间的任何字符匹配。 
\b :与单词的边界匹配,即单词与空格之间的位置。例如,"er\b" 与"never"中的"er"匹配,但是不匹配"verb"中的"er"。 
\B :与非单词边界匹配。"ea*r\B"与"never early"中的"ear"匹配。 
\d :与一个数字字符匹配。等价于[0-9]。 
\D :与非数字的字符匹配。等价于[^0-9]。 
\f :与分页符匹配。 
\n :与换行符字符匹配。 
\r :与回车字符匹配。 
\s :与任何白字符匹配,包括空格、制表符、分页符等。等价于"[ \f\n\r\t\v]"。 
\S :与任何非空白的字符匹配。等价于"[^ \f\n\r\t\v]"。 
\t :与制表符匹配。 
\v :与垂直制表符匹配。 
\w :与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。 
\W :与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。 
\num :匹配 num个,其中 num 为一个正整数。引用回到记住的匹配。例如,"(.)\1"匹配两个连续的相同的字符。 
\n:匹配 n,其中n 是一个八进制换码值。八进制换码值必须是 1, 2 或 3 个数字长。
例如,"\11" 和 "\011" 都与一个制表符匹配。"\0011"等价于"\001" 与 "1"。八进制换码值不得超过 256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。 
\xn:匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如,"\x41"匹配"A"。"\x041"等价于"\x04" 和 "1"。允许在正则表达式中使用 ASCII 码。 
RegularExpressionValidator有两种主要的属性来进行有效性验证。ControlToValidate 包含了一个值进行验证。如取出文本框中的值。如ControlToValidate="TextBox1" ValidationExpression 包含了一个正则表达式进行验证。
好了,有了上面的叙述,我们就举个例子来说明正则表达式。比如,我们想要对用户输入的电子邮件进行校验,那么,什么样的数据才算是一个合法的电子邮件呢?我可以这样输入:test@yesky.com,当然我也会这样输入:xxx@yyy.com.cn,但是这样的输入就是非法的:xxx@@com.cn或者@xxx.com.cn,等等,所以我们得出一个合法的电子邮件地址至少应当满足以下几个条件:
1. 必须包含一个并且只有一个符号"@"
2. 第一个字符不得是"@"或者"."
3. 不允许出现"@."或者.@
4. 结尾不得是字符"@"或者"."
所以根据以上的原则和上面表中的语法,我们很容易的就可以得到需要的模板如下:"= "^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$"
请看validata6.aspx的内容:

<!--源文件:form\web页面简介\validate6.aspx-->
</head>
<body>
<center><h3><font face="Verdana">使用正则表达式验证</font></h3></center>
<p>
<form runat="server">
<center>
<title>使用正则表达式验证</title>
<table bgcolor="#eeeeee" cellpadding=10>
<tr >
<td colspan=3>
<asp:Label ID="lblOutput" Text="输入E-mail地址" Font-Name="Verdana" Font-Size="10pt" runat="server"/>
</td>
</tr>
<tr>
<td align=right>
<font face=Verdana size=2>E-mail:</font>
</td>
<td>
<ASP:TextBox id=TextBox1 runat=server />
</td>
<td>
<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server"
ControlToValidate="TextBox1"
ValidationExpression="^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$"
Display="Static"
Font-Name="verdana"
Font-Size="10pt">
请输入有效的E-mail地址!
</asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td></td>
<td>
<ASP:Button text="验证" OnClick="ValidateBtn_Click" runat=server />
</td>
<td></td>
</tr>
</table>
</center>
</form>
</body>
</html>

  这样,我们只要定制不同的模板,就可以实现对不同数据的合法性校验了。所以,正则表达式对象中最重要的属性就是:"Pattern"属性,只要真正掌握了这个属性,才可以自由的运用正则表达式对象来为我们的数据校验进行服务。
程序的运行效果如图:

通过上面的介绍,我们对数据验证的方法有了一定的认识。在下面的内容中,我们还将通过更具体的实例,来对数据的有效性验证进行讲解。

2.1.3.3.3 Page_Unload

这个阶段页面已经处理完毕,需要做些清理工作。一般地,你可以在这个阶段关闭打开的文件和数据库链路,或者释放对象。
1、 断开数据库连接
请看如下脚本:
<script language="VB" runat="server">
'定义一个共有变量
public Dim MyConnection As SQLConnection
'定义Page_Load事件
Sub Page_Load(Src As Object, E As EventArgs)
Dim DS As DataSet

Dim MyCommand As SQLDataSetCommand
MyConnection = New SQLConnection("server='iceberg';uid=sa;pwd=;database=info") MyCommand = New SQLDataSetCommand("select * from infor",MyConnection)
Myconnection.open()
DS = New DataSet()
MyCommand.FillDataSet(ds, "infor")
MyDataGrid.DataSource=ds.Tables("infor").DefaultView
MyDataGrid.DataBind()
End Sub
'定义Page_UnLoad事件
Sub Page_UnLoad(Src As Object, E As EventArgs)
'与数据库断开连接
MyConnection.Close()
End Sub
现在我们在来看一个对文件操作的例子。
在这个例子中,我们使用的了两个事件,Page_Load事件和Page_Unload事件。在Page_Load事件先创建一个文件,然后向这个文件中写入内容。在Page_Unload事件中我们将此文件关闭。
代码如下:
<%@ import namespace="system.io" %>
<html>
<head>
<title>ASP.NET 测试 写 文本文件</title>
</head>
<body>
<script language="vb" runat="server">
public Dim writeFile As StreamWriter
Sub Page_Load(Sender As Object,E as EventArgs)
writeFile = File.CreateText( "c:\test.txt" )
writeFile.WriteLine( "这是一个测试文件!" )
writeFile.WriteLine( "使用了Page_Load事件和Page_Unload事件!" )
Response.Write( "test.txt 创建 并 写入 成功!" )
End Sub
Sub Page_UnLoad(Sender AS Object, E as EventArgs)
writeFile.Close
End Sub
</script>
</body>
</html>
这样,我们就使用了Page_Load事件和Page_Unload事件。很明显,我们定义Page_Load事件,是因为这个阶段页面已经处理完毕,需要做些清理工作。
上面我们分析了页面处理最重要的几个阶段。应该说明的是:页面的处理过程远比上面的复杂,因为每个控件都需要初始化。在后面的章节中,我们还将了解到更加详细的页面处理过程。

2.1.4 Web Form事件模型

在asp.net中,事件是一个非常重要的概念。我们举两个例子来说明在Web Form 中的应用。

2.1.4.1 例子一:多按钮事件

我们在一个<form></form>里面有几个按钮,多个事件的响应我们该怎么处理呢?在asp.net中有很好的处理机制,我们可以在一个页面中写几个方法来分别响应不同的事件。

在下面的例子中,将根据五个按钮的功能,我们定义了五个方法:AddBtn_Click(Sender As Object, E As EventArgs)、AddAllBtn_Click(Sender As Object, E As EventArgs)、RemoveBtn_Click(Sender As Object, E As EventArgs)、RemoveAllBtn_Click(Sender As Object, E As EventArgs)、result(Sender As Object,E As EventArgs),分别用来处理全部加进、单个加进、单个取消、全部取消和提交事件。我们的form提交的时候,还是提交给本页面,由本页面进行处理,代码如下:
<form action="menent.aspx" runat=server>
其中,menent.aspx就是本页面。

Menent.aspx文件代码如下:
<!--源文件:form\web页面简介\menent.aspx-->
<html>

<script language="VB" runat="server">

Sub AddBtn_Click(Sender As Object, E As EventArgs)

If Not (AvailableFonts.SelectedIndex = -1)
InstalledFonts.Items.Add(New ListItem(AvailableFonts.SelectedItem.Value))
AvailableFonts.Items.Remove(AvailableFonts.SelectedItem.Value)
End If
End Sub

Sub AddAllBtn_Click(Sender As Object, E As EventArgs)

Do While Not (AvailableFonts.Items.Count = 0)
InstalledFonts.Items.Add(New ListItem(AvailableFonts.Items(0).Value))
AvailableFonts.Items.Remove(AvailableFonts.Items(0).Value)
Loop
End Sub

Sub RemoveBtn_Click(Sender As Object, E As EventArgs)

If Not (InstalledFonts.SelectedIndex = -1)
AvailableFonts.Items.Add(New ListItem(InstalledFonts.SelectedItem.Value))
InstalledFonts.Items.Remove(InstalledFonts.SelectedItem.Value)
End If
End Sub

Sub RemoveAllBtn_Click(Sender As Object, E As EventArgs)

Do While Not (InstalledFonts.Items.Count = 0)
AvailableFonts.Items.Add(New ListItem(InstalledFonts.Items(0).Value))
InstalledFonts.Items.Remove(InstalledFonts.Items(0).Value)
Loop
End Sub

Sub result(Sender As Object,E As EventArgs)

dim tmpStr as String

tmpStr="<br>"
Do While Not (InstalledFonts.Items.Count = 0)
tmpStr=tmpStr & InstalledFonts.items(0).value & "<br>"
InstalledFonts.items.remove(InstalledFonts.items(0).value)
Loop
tmpStr=System.Web.HttpUtility.UrlEncodeToString(tmpStr,System.Text.Encoding.UTF
8)
Page.Navigate("result.aspx?InstalledFonts=" & tmpStr)

End Sub

</script>

<body bgcolor="#ccccff">
<center>
<h3><font face="Verdana">.NET->不同事件的处理方法!</font></h3>
</center>
<center>
<form action="menent.aspx" runat=server>

<table>
<tr>
<td>
现有字体
</td>
<td>
<!-- Filler -->
</td>
<td>
选择的字体
</td>
</tr>
<tr>
<td>
<asp:listbox id="AvailableFonts" width="100px" runat=server>
<asp:listitem>Roman</asp:listitem>
<asp:listitem>Arial Black</asp:listitem>
<asp:listitem>Garamond</asp:listitem>
<asp:listitem>Somona</asp:listitem>
<asp:listitem>Symbol</asp:listitem>
</asp:listbox>
</td>
<td>
<!-- Filler -->
</td>
<td>
<asp:listbox id="InstalledFonts" width="100px" runat=server>
<asp:listitem>Times</asp:listitem>
<asp:listitem>Helvetica</asp:listitem>
<asp:listitem>Arial</asp:listitem>
</asp:listbox>
</td>
</tr>
<tr>
<td>
<!-- Filler -->
</td>
<td>
<asp:button text="<<==" OnClick="RemoveAllBtn_Click" runat=server/>
<asp:button text="<--" OnClick="RemoveBtn_Click" runat=server/>
<asp:button text="-->" OnClick="AddBtn_Click" runat=server/>
<asp:button text="==>>" OnClick="AddAllBtn_Click" runat=server/>
<asp:label id="Message" forecolor="red" font-bold="true" runat=server/>
</td>
</tr>
<tr align=center>
<td align=center>
<asp:button text="提交" Onclick="result" runat=server/>
<!-- Filler -->
</td>
</tr>
</table>

</form>
</center>
</body>

</html>

写一个页面,在提交时候接收相关信息。我们在页面进入的时候取得传送过来的数值,用:

Request.Params("InstalledFonts")

来获得,具体来看我们的文件result.aspx的代码:
<!--源文件:form\web页面简介\result.aspx-->
<html>
<script language="VB" runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
If Not (Page.IsPostBack)
NameLabel.Text = Request.Params("InstalledFonts")
End If
End Sub
</script>

<BODY >
<h3><font face="Verdana">.NET->多事件处理!</font></h3>
<p>
<p>
<hr>
<form action="controls_NavigationTarget.aspx" runat=server>
<font face="Verdana">
Hi,你的选择是: <asp:label id="NameLabel" runat=server/>!
</font>
</form>
</body>
</html>

程序运行如下:


当我们点击提交按钮的时候,将显示:

2.1.4.2 例子二:AutoPostBack

PostBack属性在Page_Load事件中出现的,在一个用户请求结束后,如果页面重新Load,则返回一个true。这对初始化一个页面来讲是一件非常容易的事情,下面看我们的代码:

Sub Page_Load(Sender as Object,e as EventArgs)
If IsPostBack and ( TextBox2.Text = "")
TextBox2.Text="Hello" & TextBox1.Text & "!! 你好啊!"
End If
End Sub

如果IsPostBack返回一个真值并且TextBox2.Text为空,程序执行它下面的语句。在另外一个方面,我们设置一个标识:

<asp:TextBox id="TextBox1" Text="请在在这里输入你的名字!并按下<Tab>"
AutoPostBack="True" Columns=50 runat="server"/>

我们设定AutoPostBack="True",自动PostBack,下面是我们的完整的代码(autopostback..aspx):

<!--源文件:form\web页面简介\autopostback.aspx-->
<html>
<head>
<script language="VB" runat="server">

Sub Page_Load(Sender as Object,e as EventArgs)
If IsPostBack and ( TextBox2.Text = "")
TextBox2.Text="Hello" & TextBox1.Text & "!! 你好啊!"
End If
End Sub

</script>
</head>
<body>
<center>
<br><br><br>
<h3><font face="Verdana">.NET->AutoPostBack技术</font></h3>
<br><br>
</center>
<center>
<form runat="server">
<p>
<asp:TextBox id="TextBox1" Text="请在在这里输入你的名字!并按下<Tab>"
AutoPostBack="True" Columns=50 runat="server"/>
<p>
<asp:TextBox id="TextBox2" Columns=50 runat="server"/>
<p>
<asp:Button Text="提交" Runat="server"/>
<p>
</form>
</center>
</body>
</html>
访问如下:

输入完成后,按下<Tab>键,得到如下结果:

2.1.5 小结

在这一章中,我们对Web Form 页面进行了介绍,通过几个实例,我们分别介绍了Server 控件,HTML Server 控件,以及Web Form的事件模型。在下面的章节中,我们将对本章所涉及的概念进行更深入的讲解。

转自:http://www.lezhu99.com/3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值