我有以下的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,
按钮逻辑仍在运行!
答案 0 :(得分:11)
在按钮的onclick功能中,添加一项检查以确定页面是否有效
protected void CreateUserButton_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
// Create the user
}
}
应该这样做。这是因为您的自定义验证程序设置为在回发期间在服务器上进行验证。会发生的是代码首先运行验证程序代码UserValidate
,您可以在其中设置IsValid
标志。在回发堆栈中的下一个是按钮的onclick功能。无论验证器函数中的结果如何,此函数都将运行,因此您需要检查IsValid
标志的值。这是在服务器端验证自定义验证控件时的行为。
另一种方法是在客户端进行验证。如果您查看浏览器生成的页面源代码,您会看到为RegularExpressionValidator
添加了Javascript。它的行为是已知的,并在客户端处理,因此不需要回发来评估表达式并验证页面(它全部由javascript处理)。自定义验证器功能未知,因此除非您自己定义客户端验证脚本,否则需要回发。
以下是有关MSDN的更多信息的链接。