ASP.NET 必填字段验证器和自定义验证器不工作
ASP.NET Required Field Validator & Custom Validator not working
这是我的 aspx 代码
<p class="input-block last">
<asp:TextBox ID="uxEmployerName" runat="server" CssClass="uxemail" TabIndex="10" ValidationGroup="EmployerRegister" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="uxEmployerName" ErrorMessage="You must enter Company Name." EnableClientScript="false" Display="none" ValidationGroup="EmployerRegister" />
</p>
<p class="input-block last">
<asp:TextBox ID="uxEmail" runat="server" CssClass="uxemail" TabIndex="16" ValidationGroup="EmployerRegister" />
<asp:RequiredFieldValidator ID="uxEmailValReq" runat="server" ControlToValidate="uxEmail" ErrorMessage="You must enter Email." EnableClientScript="false" Display="none" ValidationGroup="EmployerRegister" />
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="The 'Email Address' you have entered does not appear to be a valid address." ControlToValidate="uxEmail" EnableViewState="False" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="EmployerRegister" Display="None" />
</p>
<p class="input-block last">
<asp:LinkButton runat="server" ID="uxRegisterButton" Text="Submit" CausesValidation="true" ValidationGroup="EmployerRegister" CssClass="button" TabIndex="18" />
<a class="button" href="#" tabindex="17">Edit package</a>
</p>
这里唯一的验证器是 RegularExpressionValidator
如果我输入了错误的电子邮件格式,则会显示错误消息。但如果我离开电子邮件字段则不会。
我做错了什么。任何解决方案
我还添加了一个带有电子邮件字段的自定义验证器
<asp:CustomValidator ID="uxEmailValUnique" runat="server" ErrorMessage="It appears that you already have an account with us. <br/><a href='forgotten-password.aspx'>Request password</a>"
ControlToValidate="uxEmail" EnableViewState="False" ValidationGroup="EmployerRegister"
Display="None" />
后端服务器代码是
Private Sub uxEmailValUnique_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles uxEmailValUnique.ServerValidate
args.IsValid = Not LocalHelper.EmailExists(uxEmail.Text)
End Sub
在 LocalHelper 文件中的位置
Shared Function EmailExists(email As String) As Boolean
Return DB.GetInteger("select count(id) from [user] where deleted = 0 and active = 1 and email = @email", DB.SIP("email", email)) > 0
End Function
这个也不行
我做错了什么。
我假设您有一个与此类似的 ValidationSummary 控件:
<asp:ValidationSummary runat="server" ForeColor="Red" ValidationGroup="EmployerRegister" />
如果您的任何验证器启用了客户端验证(EnableClientScript="true"
,默认值),它将在客户端验证失败时阻止回发,因此不会执行服务器端验证。在您当前的代码中,RegularExpressionValidator 启用了客户端验证(实际上并未明确禁用);如果失败,则不会对必填字段执行服务器端验证,并且不会显示其他错误消息。
您可以禁用所有验证器的客户端验证。每次您提交表单时,都会为所有这些人(如果适用)显示该消息。
<asp:RequiredFieldValidator ID="uxEmployerNameValReq" EnableClientScript="false" ... />
<asp:RequiredFieldValidator ID="uxEmailValReq" EnableClientScript="false" ... />
<asp:RegularExpressionValidator ID="uxEmailExprVal" EnableClientScript="false" ... />
<asp:CustomValidator ID="uxEmailValUnique" EnableClientScript="false" ... />
另一个合理的方法是为最基本的要求启用客户端验证器,并为 CustomValidator 禁用它。如果电子邮件为空或一开始就无效,则更高级的验证没有多大意义。
<asp:RequiredFieldValidator ID="uxEmployerNameValReq" EnableClientScript="true" ... />
<asp:RequiredFieldValidator ID="uxEmailValReq" EnableClientScript="true" ... />
<asp:RegularExpressionValidator ID="uxEmailExprVal" EnableClientScript="true" ... />
<asp:CustomValidator ID="uxEmailValUnique" EnableClientScript="false" ... />
N.B。在您的问题中,您说当电子邮件字段为空时不会显示验证消息。我在我的测试中没有看到你的原始代码有这种行为。
这是我的 aspx 代码
<p class="input-block last">
<asp:TextBox ID="uxEmployerName" runat="server" CssClass="uxemail" TabIndex="10" ValidationGroup="EmployerRegister" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="uxEmployerName" ErrorMessage="You must enter Company Name." EnableClientScript="false" Display="none" ValidationGroup="EmployerRegister" />
</p>
<p class="input-block last">
<asp:TextBox ID="uxEmail" runat="server" CssClass="uxemail" TabIndex="16" ValidationGroup="EmployerRegister" />
<asp:RequiredFieldValidator ID="uxEmailValReq" runat="server" ControlToValidate="uxEmail" ErrorMessage="You must enter Email." EnableClientScript="false" Display="none" ValidationGroup="EmployerRegister" />
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="The 'Email Address' you have entered does not appear to be a valid address." ControlToValidate="uxEmail" EnableViewState="False" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="EmployerRegister" Display="None" />
</p>
<p class="input-block last">
<asp:LinkButton runat="server" ID="uxRegisterButton" Text="Submit" CausesValidation="true" ValidationGroup="EmployerRegister" CssClass="button" TabIndex="18" />
<a class="button" href="#" tabindex="17">Edit package</a>
</p>
这里唯一的验证器是 RegularExpressionValidator
如果我输入了错误的电子邮件格式,则会显示错误消息。但如果我离开电子邮件字段则不会。
我做错了什么。任何解决方案
我还添加了一个带有电子邮件字段的自定义验证器
<asp:CustomValidator ID="uxEmailValUnique" runat="server" ErrorMessage="It appears that you already have an account with us. <br/><a href='forgotten-password.aspx'>Request password</a>"
ControlToValidate="uxEmail" EnableViewState="False" ValidationGroup="EmployerRegister"
Display="None" />
后端服务器代码是
Private Sub uxEmailValUnique_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles uxEmailValUnique.ServerValidate
args.IsValid = Not LocalHelper.EmailExists(uxEmail.Text)
End Sub
在 LocalHelper 文件中的位置
Shared Function EmailExists(email As String) As Boolean
Return DB.GetInteger("select count(id) from [user] where deleted = 0 and active = 1 and email = @email", DB.SIP("email", email)) > 0
End Function
这个也不行
我做错了什么。
我假设您有一个与此类似的 ValidationSummary 控件:
<asp:ValidationSummary runat="server" ForeColor="Red" ValidationGroup="EmployerRegister" />
如果您的任何验证器启用了客户端验证(EnableClientScript="true"
,默认值),它将在客户端验证失败时阻止回发,因此不会执行服务器端验证。在您当前的代码中,RegularExpressionValidator 启用了客户端验证(实际上并未明确禁用);如果失败,则不会对必填字段执行服务器端验证,并且不会显示其他错误消息。
您可以禁用所有验证器的客户端验证。每次您提交表单时,都会为所有这些人(如果适用)显示该消息。
<asp:RequiredFieldValidator ID="uxEmployerNameValReq" EnableClientScript="false" ... />
<asp:RequiredFieldValidator ID="uxEmailValReq" EnableClientScript="false" ... />
<asp:RegularExpressionValidator ID="uxEmailExprVal" EnableClientScript="false" ... />
<asp:CustomValidator ID="uxEmailValUnique" EnableClientScript="false" ... />
另一个合理的方法是为最基本的要求启用客户端验证器,并为 CustomValidator 禁用它。如果电子邮件为空或一开始就无效,则更高级的验证没有多大意义。
<asp:RequiredFieldValidator ID="uxEmployerNameValReq" EnableClientScript="true" ... />
<asp:RequiredFieldValidator ID="uxEmailValReq" EnableClientScript="true" ... />
<asp:RegularExpressionValidator ID="uxEmailExprVal" EnableClientScript="true" ... />
<asp:CustomValidator ID="uxEmailValUnique" EnableClientScript="false" ... />
N.B。在您的问题中,您说当电子邮件字段为空时不会显示验证消息。我在我的测试中没有看到你的原始代码有这种行为。