惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园_首页
T
Tailwind CSS Blog
美团技术团队
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
MongoDB | Blog
MongoDB | Blog
The Cloudflare Blog
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog

博客园 - Tam

IIS 7.0集成模式中Application_Start不能使用HttpContext.Current log4net - 4步快速配置跟踪日志(ASP.NET) Windows Workflow Foundation - [Workflow Runtime] Windows Workflow Foundation - [介绍及相关资源] TortoiseSVN 安装使用 VS2005里三种有用的调试方法 使用Iframe时要注意的一个问题 - Tam - 博客园 必须要知道的GridView用法(1) 试用Code Snippets Manager 学习使用ASP.NET 2.0的本地化 XSLT 运算符 和 记录一些用过的语句 IIS里面设置好虚拟目录后访问出现Server Application Unavailable 转载:如何在自己的网站上做天气预报? - Tam - 博客园 Linux Shell Record 在VMWARE上安装Fedora Core 5遇到的错误 DCOM错误 TASTE CSS DESIGN ASP.NET 传递参数到XSLT - Tam - 博客园 ASP.NET中如何知道文件是否被下载过?
ASP.NET 验证控件
Tam · 2009-09-22 · via 博客园 - Tam

介绍:
当我们开发服务器控件的时候,使用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