Проблема с CustomValidator

На моей странице есть несколько валидаторов ASP.NET различных типов, некоторые из которых я отключаю в зависимости от выбора пользователя на странице с помощью javascript.

$.each(Page_Validators, function(index, validator) 
       {
           if ($(validator).hasClass("pain")) {

               ValidatorEnable(validator, false);

        }
});

Кажется, это работает, и валидаторы не срабатывают во всех случаях, кроме любых CustomValidator, которые я использую всякий раз, когда я не могу использовать другие типы валидаторов.

 <asp:CheckBoxList id="BodyPartsList" runat="server" RepeatColumns = "2" 
                    Width="1023px">
                    <asp:ListItem Text = "0. Head/headaches" Value = "1"></asp:ListItem>
                    <asp:ListItem Text = "1. Leg(s)" Value = "2"></asp:ListItem>
                    <asp:ListItem Text = "2. Arm(s)" Value = "3"></asp:ListItem>
                    <asp:ListItem Text = "3. Neck" Value = "4"></asp:ListItem>
                    <asp:ListItem Text = "4. Shoulder(s)" Value = "5"></asp:ListItem>
                    <asp:ListItem Text = "5. Low Back" Value = "6"></asp:ListItem>
                    <asp:ListItem Text = "6. Upper Back" Value = "7"></asp:ListItem>
                    <asp:ListItem Text = "7. Feet" Value = "8"></asp:ListItem>
                    <asp:ListItem Text = "8. Hand(s)" Value = "9"></asp:ListItem>
                    <asp:ListItem Text = "9. Other(Describe in &quot;Details of Plan&quot;)" Value = "10"></asp:ListItem>
                </asp:CheckBoxList>

                <asp:CustomValidator ID="PainLocationValidator" runat="server" Display="Dynamic"
                ErrorMessage="Location of pain is required." 
                ClientValidationFunction="checkPainListValidate" 
                ValidationGroup = "OnSave" EnableClientScript= "true" SetFocusOnError= "true" Width = "100%" CssClass = "pain" />



 function checkPainListValidate(sender, args) {

    args.IsValid = true;

    if ($('#<%= BodyPartsList.ClientID %> input:checked').length > 0)
        args.IsValid = true;

    else
        args.IsValid = false;

}

Почему это происходит? Что еще я могу сделать, чтобы их отключить?

Спасибо.


person Victor    schedule 08.02.2011    source источник


Ответы (1)


Некоторая aspx-разметка была бы полезна, но в любом случае вот несколько идей:

  • вы отлаживали javascript, чтобы увидеть, что происходит, если ваш валидатор имеет значение null или у вас есть тип типа validatorEnable вместо ValidatorEnable? У вас есть ошибки javascript?
  • Проверяет ли CustomValidator на сервере или на стороне клиента, я думаю, что ValidatorEnable отключит его только на стороне клиента
  • установить EnableClientScript в значение "истина"
  • Если вы не укажете ControlToValidate, CustomValidator будет проверять каждую обратную передачу, независимо от события, вызвавшего ее.
  • Вы предоставили ClientValidationFunction, который вызывается на стороне клиента?
  • кстати, какой браузер и какой фреймворк вы используете, это ASP.Net-Ajax?
  • вы пробовали отключить через document.getElementById('<%=MyValidator.ClientID %>').disabled=true;?

Я предполагаю, что вы используете неправильный идентификатор, чтобы получить валидатор на стороне клиента.

Я проверил ваш код и не могу воспроизвести такое поведение:

Это моя функция Javascript для отключения всех валидаторов (отредактирована с учетом вашего класса боли):

 function disablePainValidators() {
     if ((typeof (Page_Validators) != "undefined") && (Page_Validators != null)) {
         var i;
         for (i = 0; i < Page_Validators.length; i++) {
             if(Page_Validators[i].className=='pain')
                 ValidatorEnable(Page_Validators[i], false);
         }
     }
 }
person Tim Schmelter    schedule 08.02.2011
comment
Спасибо за ответ и некоторые полезные идеи 1. Я не понял 1-ю идею 2. Я проверяю ее на стороне клиента, поэтому использую ClientValidationFunction, see the update 3. I do not specify ControlToValidate, поскольку это список флажков, и я получаю ошибки, если это сделаю. 4. Если вы отключите валидатор, будет ли он проверяться при каждой обратной передаче? - person Victor; 09.02.2011
comment
@Victor: пункт 1 был опечаткой, которую я удалил только частично (пустой текст никогда не проверяется, если вы не установите ValidateEmptyText в значение true, но это вам здесь не поможет). Я думал, вы хотите отключить валидатор, так почему вы спрашиваете, будет ли он проверяться при обратной передаче? Покажите нам также js-код, в котором вы отключаете валидаторы и ClientValidationFunction. Отладьте js, чтобы увидеть, что произойдет. - person Tim Schmelter; 09.02.2011
comment
@Tim Да, я пытаюсь отключить валидатор, поэтому просто интересно, почему он все еще активен, а обратная передача никогда не происходит. Есть несколько валидаторов с этим классом, и только CustomValidator остается активным. - person Victor; 09.02.2011
comment
@Victor: ControlToValidate не работает для CheckBoxList (см. Мой №4). - person Tim Schmelter; 09.02.2011
comment
@ Тим, я знаю, поэтому не могу его использовать - person Victor; 09.02.2011
comment
@Victor: взгляните на мою js-функцию, чтобы отключить валидаторы с pain-классом, который у меня работает. Возможно, ваш jQuery каким-то образом не работает. - person Tim Schmelter; 09.02.2011
comment
@Victor: я пробовал ваш код, но с моим js, чтобы отключить валидатор и пустую функцию проверки, которая содержит только args.IsValid=false; и работает во всех браузерах, как ожидалось (только для первой обратной передачи, после этого она снова включается). - person Tim Schmelter; 09.02.2011
comment
странно, моя функция проверки выше, но это не должно иметь никакого значения. - person Victor; 09.02.2011
comment
пришлось отказаться от использования CustomValidator, но вместо этого реализовал свой собственный. Но я ценю усилия, поэтому приму - person Victor; 09.02.2011