介绍:当我们开发服务器控件的时候,使用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
//<
function WebForm_OnSubmit()
{
4
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
5
return true;
6
}
7
//]]>
8
</script>
以上代码的作用是提交之前先检查页面是否有效,如果无效的话(例如必填项为空),则取消提交动作。在这方法里面,我们看到它会调用一个叫ValidatorOnSubmit的方法。此方法的具体内容是: 1
<script type="text/javascript">
2
//<
if (typeof(ValidatorOnLoad) == "function")
{
6
ValidatorOnLoad();
7
}
8
9
function ValidatorOnSubmit()
{
10
if (Page_ValidationActive)
{
11
return ValidatorCommonOnSubmit();
12
}
13
else
{
14
return true;
15
}
16
}
17
//]]>
18
</script>
页面执行顺序是,当页面刚初始化完成,先将变量Page_ValidationActive设为false, 方法ValidatorOnLoad()执行的最后一步,会将这个变量设置回true。1
function 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("Button1", "", true, "", "", false, false))"
WebForm_DoPostBackWithOptions方法:
Code
1
function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)
{
2
this.eventTarget = eventTarget;
3
this.eventArgument = eventArgument;
4
this.validation = validation;
5
this.validationGroup = validationGroup;
6
this.actionUrl = actionUrl;
7
this.trackFocus = trackFocus;
8
this.clientSubmit = clientSubmit;
9
} WebForm_PostBackOptions方法:
Code
1
function WebForm_DoPostBackWithOptions(options)
{
2
var validationResult = true;
3
if (options.validation)
{
4
if (typeof(Page_ClientValidate) == 'function')
{
5
validationResult = Page_ClientValidate(options.validationGroup);
6
}
7
}
8
if (validationResult)
{
9
if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0))
{
10
theForm.action = options.actionUrl;
11
}
12
if (options.trackFocus)
{
13
var lastFocus = theForm.elements["__LASTFOCUS"];
14
if ((typeof(lastFocus) != "undefined") && (lastFocus != null))
{
15
if (typeof(document.activeElement) == "undefined")
{
16
lastFocus.value = options.eventTarget;
17
}
18
else
{
19
var active = document.activeElement;
20
if ((typeof(active) != "undefined") && (active != null))
{
21
if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0))
{
22
lastFocus.value = active.id;
23
}
24
else if (typeof(active.name) != "undefined")
{
25
lastFocus.value = active.name;
26
}
27
}
28
}
29
}
30
}
31
}
32
if (options.clientSubmit)
{
33
__doPostBack(options.eventTarget, options.eventArgument);
34
}
35
} Page_ClientValidate方法:
Code
1
function Page_ClientValidate(validationGroup)
{
2
Page_InvalidControlToBeFocused = null;
3
if (typeof(Page_Validators) == "undefined")
{
4
return true;
5
}
6
var i;
7
for (i = 0; i < Page_Validators.length; i++)
{
8
ValidatorValidate(Page_Validators[i], validationGroup, null);
9
}
10
ValidatorUpdateIsValid();
11
ValidationSummaryOnSubmit(validationGroup);
12
Page_BlockSubmit = !Page_IsValid;
13
return Page_IsValid;
14
} ValidatorUpdateIsValid方法:1
function ValidatorUpdateIsValid()
{
2
Page_IsValid = AllValidatorsValid(Page_Validators);
3
} 当我们点击按钮时,事件的执行顺序是:- 调用WebForm_DoPostBackWithOptions方法。
- 调用WebForm_PostBackOptions方法。
- 调用Page_ClientValidate方法
- 在Page_ClientValidate里面,调用ValidatorUpdateIsValid方法,设置值Page_IsValid。
- 最后,调用页面的__doPostBack方法。
- 在__doPostBack方法中,我们可以看到,调用了<form>中的onsubmit()方法。
- 接着,调用WebForm_OnSubmit方法。
- 调用ValidatorOnSubmit方法。
- 调用ValidatorCommonOnSubmit方法。
此时,如果ValidatorCommonOnSubmit方法返回false,则onSubmit()同时为false,页面不进行提交。参考文章:1. ASP.NET Validation in Depth2. Understanding ASP.NET Validation Library