自定义验证器未触发(没有错误消息,但没有验证)

时间:2011-01-17 12:37:59

标签: asp.net vb.net validation master-pages findcontrol

我有一个自定义验证器:

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

4 个答案:

答案 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