65.9K
CodeProject 正在变化。 阅读更多。
Home

依赖于多个控件的 CustomValidator。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.51/5 (23投票s)

2005 年 2 月 7 日

3分钟阅读

viewsIcon

309923

downloadIcon

2877

如何要求用户至少输入多个文本框中的一个的示例。

Sample Image - MultiDependValidator.jpg

引言

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 将此脚本添加到页面,但是该方法更难阅读和理解。 我在 CustomValidatorPreRender 事件中执行此操作。

其他示例

你可以使用此方法创建复杂的验证。 例如,我有一个包含各种选项的下拉列表。 其中一个选项是“其他/参见评论”。 下拉列表还包括一个空白条目“选择选项”。 我创建了一个验证器,要求用户为下拉列表输入一个值,如果他们选择“其他/参见评论”,则要求评论中包含内容。

你可以相互验证两个下拉列表。 例如,如果你要销售服装,你可以为商品类型设置一个下拉列表,并为颜色选择设置一个下拉列表。 然后,在你的验证器中,你可以显示该商品没有该颜色可用的错误消息。 也就是说,你出售蓝色、绿色和红色的衬衫。 但只出售蓝色和绿色的裤子。

演示

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 的示例。

谢谢

如果您阅读了这篇文章,请在下方留言。

© . All rights reserved.