CustomValidator效果不佳

Ran*_*anH 9 c# asp.net customvalidator custom-validators

我有以下几片asp:

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
        ValidationGroup="RegisterUserValidationGroup"/>
Run Code Online (Sandbox Code Playgroud)

...

<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>
Run Code Online (Sandbox Code Playgroud)

然后功能:

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;
    }
Run Code Online (Sandbox Code Playgroud)

按钮:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
       ValidationGroup="RegisterUserValidationGroup" 
       onclick="CreateUserButton_Click"/>
Run Code Online (Sandbox Code Playgroud)

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

The*_*son 11

在按钮的onclick功能中,添加一个检查以查看页面是否有效

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

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

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

这是有关MSDN的更多信息的链接.

  • 它们被设置为runat = server仅意味着服务器生成它们,并且您可以在代码隐藏中访问它们.但是,如果您查看浏览器生成的页面源代码,您将看到为regularexpressionvalidator添加了javascripts.它的行为是已知的,因此不需要回复来评估表达式并验证页面(它全部由javascript处理).自定义验证程序功能未知,因此需要回发(除非您在javascript中设置了客户端验证脚本). (3认同)