0

我有一个自定义验证器:

 <asp:CustomValidator ID="QuestionValidator" runat="server" ErrorMessage="Please select an option" ClientValidationFunction="QuestionValidator_ServerValidate" OnServerValidate="QuestionValidator_ServerValidate" ValidateEmptyText="true"></asp:CustomValidator> 

我有一个数据列表提供的问题列表,我需要确保用户选择每个问题的答案。然后我有我的验证功能:

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 循环通过控件来完成此类验证,但这不可用,因为页面使用通过母版页传递的表单。

4

4 回答 4

1

我会尝试遍历“Page.NamingContainer”或“Page.Controls”,看看情况如何。

于 2011-01-17T12:56:46.177 回答
1

也许我错过了一些东西,但你不应该在自定义验证器中设置属性 ControlToValidate="ID_of_the_control_to_validate" 吗?

于 2011-01-17T13:26:44.950 回答
1

我认为您需要为 CustomValidator 和 Validaiton 过程中涉及的所有控件提供 ValidationGroup

于 2011-01-17T14:09:35.240 回答
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
于 2011-01-17T17:44:17.807 回答