【问题标题】:CustomValidator not working wellCustomValidator 不能正常工作
【发布时间】:2012-06-16 15:10:47
【问题描述】:

我有下面一段asp:

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
        ValidationGroup="RegisterUserValidationGroup"/>

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label>
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
      ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server"
      CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup">
    *</asp:RegularExpressionValidator>
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
      ValidationGroup="RegisterUserValidationGroup"  OnServerValidate="UserValidate">*</asp:CustomValidator>

然后是函数:

protected void UserValidate(object source, ServerValidateEventArgs args)
    {
        SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'";
        DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        if (dv.Table.Rows.Count != 0)
            args.IsValid = false;
        else
            args.IsValid = true;
    }

按钮:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
       ValidationGroup="RegisterUserValidationGroup" 
       onclick="CreateUserButton_Click"/>

问题是即使调用了自定义验证器函数并将.IsValid设置为false, 按钮逻辑仍在运行!

【问题讨论】:

  • 我不确定它是否值得,但我也尝试设置 NoUserValidator.IsValid = false
  • 我没有在您的标记中看到该按钮,但请确保它的 ValidationGroup 设置为您的 RegisterUserValidationGroup。
  • 我在msg中添加了按钮代码

标签: c# asp.net customvalidator custom-validators


【解决方案1】:

在按钮的 onclick 函数中,添加检查页面是否有效

protected void CreateUserButton_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    { 
        // Create the user
    }
}

应该这样做。这是因为您的自定义验证器设置为在回发期间在服务器上进行验证。发生的情况是代码首先运行验证器代码UserValidate,您在其中设置了IsValid 标志。回发堆栈中的下一个是按钮的 onclick 函数。无论验证器函数中的结果如何,此函数都会运行,因此您需要检查IsValid 标志的值。这是您在服务器端验证自定义验证控件时的行为。

另一种方法是在客户端进行验证。如果您查看浏览器生成的页面源代码,您会看到为 RegularExpressionValidator 添加了 Javascript。它的行为是已知的,并在客户端处理,因此不需要回发来评估表达式和验证页面(这一切都由 javascript 处理)。自定义验证器功能未知,因此需要回发,除非您自己定义客户端验证脚本。

这里是MSDN更多信息的链接。

【讨论】:

  • 感谢它修复了它,你能解释一下为什么它可以与其他验证器一起正常工作,而对于自定义验证器,我必须添加你写的内容?
  • 其实我不确定,所以我只是猜测,但我认为这是因为其他验证器正在客户端验证,而自定义验证器正在验证服务器端。由于它是服务器端,回发已经开始,您首先执行自定义验证器,然后执行按钮的单击功能。这有意义吗?
  • 将它们设置为 runat=server 仅意味着服务器生成它们,并且您可以在代码隐藏中访问它们。但是,如果您查看浏览器生成的页面源代码,您会看到为正则表达式验证器添加了 javascript。它的行为是已知的,因此不需要回发来评估表达式并验证页面(这一切都由 javascript 处理)。自定义验证器功能未知,因此需要回发(除非您在 javascript 中设置客户端验证脚本)。
  • 谢谢。这真的帮助了我。您是否有MSDN 参考?或任何其他文章/博客参考?
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2010-11-30
  • 2021-10-02
  • 2017-08-06
  • 2013-11-22
相关资源
最近更新 更多