这是一个愚蠢的问题,因为找到一个直接的答案是非常微不足道但又令人困惑。
我为表单提供了一系列自定义验证器,所有这些验证器似乎都正常工作。我现在正在VB.net上写这些。
当用户点击提交按钮时,我这样做:
Protected Sub Submission_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitButton.Click
Page.Validate()
If (Page.IsValid) Then
... //Go on to accept the form.
End If
End Sub
问题是:如果我的一个自定义验证器通过,则args.IsValid设置为true,因此在上面的代码中,它直接进入If和on,将表单提交给DB。
Protected Sub AffidavitValidator_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles AffidavitValidator.ServerValidate
If (Not AffidavitYes.Checked = True And Not AffidavitNo.Checked = True) Then
args.IsValid = False
ElseIf (AffidavitNo.Checked = True) Then
args.IsValid = False
ElseIf (AffidavitYes.Checked = True) Then
args.IsValid = True
End If
End Sub
因此,例如,如果他们在页面上为“是或否”选择“是”,那么表单将自动验证,因为args.IsValid = True,即使他们甚至没有填写任何其他表单字段。这是一个大问题,因为这并不是拥有多个验证器的预期效果。我希望只有当所有验证器通过时才接受表单。
我需要确保自定义验证程序函数的任何 一个 设置args.IsValid = False,然后表单不应该被验证,因此不被接受
现在这里有更多信息。我将所有自定义验证器设置在同一个ValidationGroup中,并且我还将所有自定义验证器设置为在空时验证(即,即使用户从未触及控件,仍然运行其自定义验证功能)。
我认为因为“是或否”项目符号位于页面底部,所以它们是我在Submission_Click函数中验证的最后一个。因此,即使其他验证器可能将args.IsValid设置为false,因为最后一个验证器将其设置为true,则表单被接受。但是我真的不知道如何以简洁有效的方式纠正这个问题。
答案 0 :(得分:0)
通过修改ASP.net验证器控件的不同属性,我弄清楚出了什么问题。 “Visible”属性必须设置为true。要完全呈现它们,包括它们的CodeBehind。 (对我来说,这不是很直观,因为我认为Visible属性只会引用它们的显示,而不是它们的CodeBehind - 事实证明,如果将visible设置为false,则控件不仅不会显示但它的代码隐藏不会运行)