我有一个自定义验证器:
<asp:CustomValidator ID="QuestionValidator" runat="server" ErrorMessage="Please select an option" ClientValidationFunction="QuestionValidator_ServerValidate" OnServerValidate="QuestionValidator_ServerValidate" ValidateEmptyText="true"></asp:CustomValidator>
我有一个由datalist提供的问题列表,我需要确保用户选择每个问题的答案。然后我有我的验证功能:
Protected Sub QuestionValidator_ServerValidate(ByVal source As Object, ByVal args As ServerValidateEventArgs)
Dim SelectedItem As Boolean = False
For Each c As Control In Page.Master.FindControl("form1").Controls
If TypeOf c Is RadioButton Then
Dim rb As RadioButton = DirectCast(c, RadioButton)
If rb.GroupName = "AnswerOptions" AndAlso rb.Checked = True Then
SelectedItem = True
End If
End If
Next
args.IsValid = SelectedItem
End Sub
<script type="text/javascript" language="javascript">
function QuestionValidator_ServerValidate() {
return true;
}
</script>
当我运行页面时,没有验证,也没有错误消息。请你指出我出错的地方,我怀疑是Page.Master.FindControl("form1").Controls
。
我以前通过form1.controls循环控制来完成此类验证,但由于页面使用通过母版页向下传递的表单,因此不可用。
答案 0 :(得分:1)
我会尝试循环遍历“Page.NamingContainer”或“Page.Controls”,看看情况如何。
答案 1 :(得分:1)
也许我错过了什么,但是你不应该在自定义验证器中设置属性ControlToValidate =“ID_of_the_control_to_validate”吗?
答案 2 :(得分:1)
我认为您需要为CustomValidator和Validaiton流程中涉及的所有控件提供ValidationGroup
答案 3 :(得分:1)
您的代码可能存在缺陷。因为根据逻辑,如果页面上有50个单选按钮,即使只选择了一个,您的验证也会通过。此外,所有RB的组名对于每个项目都是相同的。不确定ASP.NET是否重命名那些,如果没有,那么所有的RB都会被分组为一个用于所有问题。
对于循环部分,您可以遍历DataList.Items集合,而不是循环遍历表单上的所有控件: Dim item As DataListItem
For Each item In DataList1.Items
Dim ctrl As Control
For Each ctrl In item.Controls
'do your rb state check here
Next ctrl
Next item