代码改变世界

ASP.NET 验证控件

2009-09-22 23:58  Tam  阅读(664)  评论(0编辑  收藏  举报
介绍:
当我们开发服务器控件的时候,使用ASP.NET自带的验证控件,能简化许多操作,下面就此简单介绍一下ASP.NET验证控件的工作原理。

如何实现验证的?
首先,我们先建立一个简单的网站工程。在页面上放上三个作DEMO用的控件(TextBox, Button, RequiredFieldValidator),完成后页面代码如下:
 1<body>
 2    <form id="form1" runat="server">
 3    <div>
 4        <div>
 5            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></div>
 6        <div>
 7            <asp:Button ID="Button1" runat="server" Text="Button" />
 8        </div>
 9    </div>
10    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="RequiredFieldValidator"
11        ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
12    </form>
13</body>
验证控件属性ControlToValidate指向TextBox控件。那么,页面就完成了。

然后,我们在浏览器打开此页面,并查看其源代码。会发现在<form>中多出了一段代码:
1 onsubmit="javascript:return WebForm_OnSubmit();"

而在此段代码的下面,会同时出现对应的JS方法:

1<script type="text/javascript"> 
2//<![CDATA[
3function WebForm_OnSubmit() {
4if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == falsereturn false;
5return true;
6}

7//]]>
8</script>

以上代码的作用是提交之前先检查页面是否有效,如果无效的话(例如必填项为空),则取消提交动作。
在这方法里面,我们看到它会调用一个叫ValidatorOnSubmit的方法。
此方法的具体内容是:
 1<script type="text/javascript"> 
 2//<![CDATA[
 3 
 4var Page_ValidationActive = false;
 5if (typeof(ValidatorOnLoad) == "function"{
 6    ValidatorOnLoad();
 7}

 8 
 9function ValidatorOnSubmit() {
10    if (Page_ValidationActive) {
11        return ValidatorCommonOnSubmit();
12    }

13    else {
14        return true;
15    }

16}

17        //]]>
18</script>

页面执行顺序是,当页面刚初始化完成,先将变量Page_ValidationActive设为false, 方法ValidatorOnLoad()执行的最后一步,会将这个变量设置回true。
1function ValidatorOnLoad() {
2    if (typeof(Page_Validators) == "undefined")
3        return;
4
5    省略中间验证控件和目标控件的绑定代码
6
7    Page_ValidationActive = true;
8}

同时,我们的按钮会加上下面的属性:
1 onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Button1&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))"

WebForm_DoPostBackWithOptions方法:
Code

WebForm_PostBackOptions方法:
Code

Page_ClientValidate方法:
Code

ValidatorUpdateIsValid方法:
1function ValidatorUpdateIsValid() {
2    Page_IsValid = AllValidatorsValid(Page_Validators);
3}


当我们点击按钮时,事件的执行顺序是:
  1. 调用WebForm_DoPostBackWithOptions方法。
  2. 调用WebForm_PostBackOptions方法。
  3. 调用Page_ClientValidate方法
  4. 在Page_ClientValidate里面,调用ValidatorUpdateIsValid方法,设置值Page_IsValid。
  5. 最后,调用页面的__doPostBack方法。
  6. 在__doPostBack方法中,我们可以看到,调用了<form>中的onsubmit()方法。
  7. 接着,调用WebForm_OnSubmit方法。
  8. 调用ValidatorOnSubmit方法。
  9. 调用ValidatorCommonOnSubmit方法。
此时,如果ValidatorCommonOnSubmit方法返回false,则onSubmit()同时为false,页面不进行提交。



参考文章:
1. ASP.NET Validation in Depth
2. Understanding ASP.NET Validation Library