Пользовательский валидатор не запускается (нет сообщения об ошибке, но нет проверки) - PullRequest
0 голосов
/ 17 января 2011

У меня есть пользовательский валидатор:

 <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 ]

1 голос
/ 17 января 2011

В вашем коде может быть недостаток.Потому что согласно логике, если из 50 переключателей на вашей странице, даже если выбрана только одна, ваша проверка пройдёт.Также имя группы для всех RB одинаково для каждого элемента.Не уверен, что ASP.NET переименует их, а если нет, то все RB сгруппированы в один для всех вопросов.

Для циклической части вы можете циклически проходить по коллекции DataList.Items вместо циклического прохождения по всем элементам управления наформа: затемнить элемент как 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
1 голос
/ 17 января 2011

Может быть, я что-то пропустил, но разве вы не должны устанавливать свойство ControlToValidate = "ID_of_the_control_to_validate" в пользовательском валидаторе?

1 голос
/ 17 января 2011

Я думаю, вам нужно предоставить ValidationGroup для CustomValidator и всех элементов управления, участвующих в процессе Validaiton

1 голос
/ 17 января 2011

Я бы попробовал перебрать либо "Page.NamingContainer", либо "Page.Controls" и посмотреть, как это происходит.

...