第二篇 WEB 页面

第一章           WEB 页面简介

2.1.1 WEB FORM

表单,英文单词是Form,学习过VB的朋友一定不会陌生。在MS.NET架构里,Form是一个经常使用到的词汇。比如:编写Windows 应用时会提到Windows Form,编写Web 应用时会提到Web FormWindows 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页面将被CLRcommon language runtime)编译器编译。此后,当再有用户访问此页面的时候,由于ASPX页面已经被编译过,所以,CLR会直接执行编译过的代码。这和ASP的情况完全不同。ASP只支持VBScriptJavaScript这样的解释性的脚本语言。所以ASP页面是解释执行的。当用户发出请求后,无论是第一次,还是第一千次,ASP的页面都将被动态解释执行。而asp.net支持可编译的语言,包括VB.NETC#Jscript.NET等。所以,asp.net是一次编译多次执行。

 为了简化程序员的工作,ASPX页面不需要手工编译,而是在页面被调用的时候,由CLR自行决定是否编译。一般来说,下面两种情况下,ASPX会被重新编译:

 1ASPX页面第一次被浏览器请求;

    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 valign="top">

      <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()接受的合法日期为10011日到99991231日。

运行如图:


 

    当我们在卡号一栏中输入一些字母,而不是数值时,页面上将会提示你输入数值。

    让我们再举一个很有用的验证应用:

    当用户在填写个人信息的时候,往往需要输入身份证号,那么我们是如何进行身份证号的验证呢?

    要解决这个问题,首先,让我们先看看我国的身份证号是如何编码的。

    1     2      3      4   5

    XX XXXX XXXXXX XX  X (这个是没有升位以前的一个身份证号码的组成方式)

    1   2 地市 3 生日 4 顺序码 5 性别

    在这个例子中,我们只对省份进行判断。

    身份编码一览表:

 

北京      11

吉林      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 valign="top">

      <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>

   当我们不在文本框中输入内容的时候,页面上将会出现不能为空的提示。

  

   程序运行如下:


2CompareValidator 控件

为了比较两个控件的值,此时我们需要使用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 valign="top">

        <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" onclick="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>

    在上面的代码中,我们实现了对两个控件的值进行比较。

    程序运行如下:

当我们在两个文本框中输入值,然后选定运算符后,点验证按钮后,在页面上将显示

 

比较结果:


 

3RangeValidator控件

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 valign="top">

        <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" onclick="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>

当我们在三个文本框中分别输入要验证的值,最大值,和最小值,然后按下验证按钮,页面上将显示判断的结果。

在本例中我们只能比较integerstring的值,当然,我们也可以增加数据类型,如double型,float型,date型,currency型等。

结果运行如下:

 


4. RegularExpressionValidator控件

    我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因为用户有可能输入各式各样的信息,而有些不符合要求的数据会给我们的后端ASP处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题。因此我们在将这些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据的合法性校验,以便后面的程序可以安全顺利的执行。

    使用RegularExpressionValidator服务器控件,可以用来检查我们输入的信息是否和我们的自定义的表达式一致。比方说用它可以检查e-mail地址,电话号码等合法性。

在讲述RegularExpressionValidator服务器控件使用之前,我们先来了解一下正则表达式(RegularExpression)的来源:

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。1956 , 一位叫 Stephen Kleene 的美国数学家在 McCulloch Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken ThompsonUnix 的主要发明人。正则表达式的第一个实用应用程序就是 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"

.:匹配换行符以外的任何字符