依赖于多个控件的 CustomValidator。






4.51/5 (23投票s)
2005 年 2 月 7 日
3分钟阅读

309923

2877
如何要求用户至少输入多个文本框中的一个的示例。
引言
ASP.NET 验证器是一个非常棒的省时工具。但是,它们缺乏在客户端验证多个控件的内置功能。幸运的是,这很容易解决。
背景
使用如下内容很容易
<asp:RequiredFieldValidator id=PhoneRequired runat="server"
Display="Dynamic" ErrorMessage="*" ControlToValidate="Phone" />
这要求用户填写电话号码字段。 如果你有一个电话号码字段和一个电子邮件字段怎么办? 你可以要求填写两个字段,但你可能只想允许用户只输入其中一个字段。 在这种情况下,你不能使用 RequiredFieldValidator
。
示例
要求用户输入电话或电子邮件。 客户端验证在任何字段更改时更新。
解决方案
更新!
我已经添加了一个基于 Multi-Validator 的用户控件/类,该控件/类是从 CustomValidator
扩展而来的,这使得创建依赖于多个控件的验证器更加容易。 但是,它目前编写为与 ASP.NET 2.0 beta 1 或更高版本一起使用。 有关使用该类及其两个示例的源代码,请参阅随附的 zip 文件。 以下示例适用于 ASP.NET 1.0。
字段和 CustomValidator
<b>Phone: </b><asp:TextBox id="Phone" runat="server"><br />
<b>Email: </b><asp:TextBox id="Email" runat="server">
<asp:Button id="Submit" Text="Submit" /><br />
<%-- AtLeastOneContact Custom Validator --%>
<asp:CustomValidator id="AtLeastOneContact" runat="server"
ErrorMessage="Phone or Email Required"
Display="Dynamic"
OnServerValidate="AtLeastOneContact_ServerValidate"
ClientValidationFunction="AtLeastOneContact_ClientValidate" />
注意:不要设置 ControlToValidate
。 这样做会导致在该字段为空时验证失败。 在 ASP.NET 2.0 中,我建议设置 ValidateEmptyText="true"
。
服务器端部分
' Server Side Validation
Sub AtLeastOneContact_ServerValidate(ByVal source As Object, _
ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs)
'Requires that either Phone or Email is not empty
If Phone.Text & Email.Text <> "" Then
args.IsValid = true
Else
args.IsValid = false
End If
End Sub
客户端部分
<%-- Client Side Validation --%>
<script type="text/vbscript" language="vbscript">
<!--
Sub AtLeastOneContact_ClientValidate(source, args)
'Requires that either Phone or Email is not empty
If document.getElementById("<%= Phone.ClientID %>").value & _
document.getElementById("<%= Email.ClientID %>").value <> "" Then
args.IsValid = true
Else
args.IsValid = false
End If
End Sub
'-->
</script>
创建依赖项
<%-- This configures the validator to automatically--%>
<%-- update when either of these controls is changed --%>
<script type="text/javascript">
<!--
ValidatorHookupControlID("<%= Phone.ClientID %>",
document.all["<%= AtLeastOneContact.ClientID %>"]);
ValidatorHookupControlID("<%= Email.ClientID %>",
document.all["<%= AtLeastOneContact.ClientID %>"]);
//-->
</script>
这就是魔法发生的地方... 这会通知内置的失效子程序,以便在其中一个控件发生更改时更新验证。 你可以轻松地将所需数量的控件添加到单个验证器的依赖项中。 ValidatorHookupControlID
函数是标准 Microsoft 验证脚本的一部分。
请注意,此代码必须出现在自动添加的 ValidatorOnSubmit()
函数之后。 当你使用验证控件时,此函数会被添加到页面中。 此脚本的最佳位置就在 </form>
标记之前。
我通常使用 Page.RegisterStartupScript
将此脚本添加到页面,但是该方法更难阅读和理解。 我在 CustomValidator
的 PreRender
事件中执行此操作。
其他示例
你可以使用此方法创建复杂的验证。 例如,我有一个包含各种选项的下拉列表。 其中一个选项是“其他/参见评论”。 下拉列表还包括一个空白条目“选择选项”。 我创建了一个验证器,要求用户为下拉列表输入一个值,如果他们选择“其他/参见评论”,则要求评论中包含内容。
你可以相互验证两个下拉列表。 例如,如果你要销售服装,你可以为商品类型设置一个下拉列表,并为颜色选择设置一个下拉列表。 然后,在你的验证器中,你可以显示该商品没有该颜色可用的错误消息。 也就是说,你出售蓝色、绿色和红色的衬衫。 但只出售蓝色和绿色的裤子。
演示
zip 文件包含一个单独的工作 aspx 页面。 试用一下。 请注意,在更新其中一个控件或尝试提交之前,不会显示验证错误消息。 如果你希望验证错误消息立即显示,可以将 Page.Validate
添加到 Page_OnLoad
事件中。
历史
- 原始版本 02/07/05
- 更新 02/09/05
- 我从
CustomValidator
中删除了ValidateEmptyText="true"
,因为此属性是 ASP.NET 2.0 中的新增属性。 当ControlToValidate
留空时,它不是必需的。
- 我从
- 更新 02/15/05
- 向 zip 文件添加了一个基于用户控件/类的验证器,其中包含两个示例。 此基于类的实现需要 ASP.NET 2.0。
- 更新 04/01/05
- 向 zip 文件添加了其他符合 ASP.NET 1.1 的示例。
谢谢
如果您阅读了这篇文章,请在下方留言。