ASP.NET CompareValidator问题

Mux*_*uxa 18 asp.net validation webforms .net-2.0

我有一个带有密码和确认密码文本框的网络表单.我有一个RegularExpressionValidator附加到第一个,CompareValidator附加到第二个.现在的问题是,当我在密码字段中有内容而确认密码字段中没有任何内容时,它不会显示字段不匹配的错误.只要我在"确认密码"字段中输入内容,就会显示错误.我还想允许将这两个字段留空.

我正在使用.NET 2.0

可能是什么?

pat*_*ech 18

FWIW,如果您将密码框设置为ControlToValidate,并将确认密码框设置为ControlToCompare,那么它将起作用,因为密码框中将包含某些内容,因此将运行验证.

当然,这可以允许他们提交一个带有空密码框和填写确认框的表单,因此在两者上放置一个必需的验证器可能是一个更好的主意.


Dav*_*vid 6

我有同样的问题.使用CustomValidator而不是CompareValidator.(CustomValidator有一个名为ValidateEmptyText的有用属性,CompareValidator缺少这个属性,至少在ASP.NET 2.0中是这样.)

您需要编写适当的ServerValidate函数以及ClientValidationFunction.javascript函数的函数签名与ServerValidate函数基本相同:source(object),args(ServerValidateEventArgs).

最棘手的部分是您需要编写自定义代码来访问"CompareTo"文本框,因为它不是CustomValidator的一部分.我的字段在FormView中; 您可能需要调整代码以适合您的特定情况.在下面的代码中,"fv"是FormView的名称.

客户端验证:

<script type="text/javascript">
<!--
  function cvPasswordRpt_Validate(source, args)
  {
    args.IsValid = (args.Value ==
                    document.getElementsByName("fv$tbPassword").item(0).value);
  }
//-->
</script>
Run Code Online (Sandbox Code Playgroud)

ASPX代码:

<label>New Password:</label>
<asp:TextBox ID="tbPassword" runat="server" CssClass="stdTextField" 
             TextMode="Password" ValidationGroup="edit" />
<br />
<label>Repeat New Password:</label>
<asp:TextBox ID="tbPasswordRpt" runat="server" CssClass="stdTextField"
             TextMode="Password" ValidationGroup="edit" />
<asp:CustomValidator ID="cvPasswordRpt" runat="server" Display="Dynamic"
             EnableClientScript="true" ValidationGroup="edit"
             ControlToValidate="tbPasswordRpt" ValidateEmptyText="true"
             ErrorMessage="Your passwords do not match."
             ClientValidationFunction="cvPasswordRpt_Validate"
             OnServerValidate="cvPasswordRpt_ServerValidate" />
Run Code Online (Sandbox Code Playgroud)

服务器端验证(VB.NET):

Protected Sub cvPasswordRpt_ServerValidate(ByVal sender As Object, 
                                           ByVal e As ServerValidateEventArgs)
  Dim _newPassword As String = DirectCast(fv.FindControl("tbPassword"), 
                                          TextBox).Text
  e.IsValid = e.Value.Equals(_newPassword)
End Sub
Run Code Online (Sandbox Code Playgroud)


Fra*_*man 5

您还需要使用RequiredFieldValidator.如果字段为空并且需要以这种方式与RequiredFieldValidator配对,则会传递许多验证控件.