Функция проверки клиента CustomValidator не запускается

Я думал, что то, что я пытался сделать, было довольно тривиальным, но оказалось, что это меня сильно беспокоит. Вот такая ситуация.

У меня есть два переключателя (реализовано с помощью RadButton) и RadTextBox. Я хочу проверить на клиенте перед отправкой формы, что RadTextBox не пуст, когда выбран один из двух переключателей (скажем, первый). Я использовал CustomValidator и установил ValidateEmptyText = "True" на неудачу. Выдержка кода приведена ниже:

<asp:Panel runat="server" ID="Panel1">
<table>
    <tr>
        <td class="auto-style5">
            <telerik:RadButton ID="rdBtnIndividual" runat="server" AutoPostBack="False" GroupName="rdEmplrType" 
                Text="Individual" ToggleType="Radio" OnClientCheckedChanged="rdBtnPhysical_CheckedChanged" 
                UseSubmitBehavior="False">
                <ToggleStates>
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadioChecked" />
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadio" />
                </ToggleStates>
            </telerik:RadButton>
        </td>
        <td>
            <telerik:RadButton ID="rdBtnLegal" runat="server" AutoPostBack="False" GroupName="rdEmplrType" Text="Legal Entity" 
                ToggleType="Radio" OnClientCheckedChanged="rdBtnLegal_CheckedChanged" UseSubmitBehavior="False">
                <ToggleStates>
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadioChecked" />
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadio" />
                </ToggleStates>
            </telerik:RadButton>
        </td>
    </tr>
    <tr>
        <td class="auto-style5">
            <label>Name:</label>
        </td>
        <td>
            <telerik:RadTextBox ID="txtName" Runat="server" EmptyMessage="Name" LabelWidth="64px" Resize="None" Width="160px" DisabledStyle-BackColor="Silver">
            </telerik:RadTextBox>
        </td>
        <td><asp:RequiredFieldValidator ID="THIS_IS_WORKING" ControlToValidate="txtName"
                runat="server" ErrorMessage="<img src='images/Exclamation.png' Title='Required Field'/>" >
            </asp:RequiredFieldValidator>
        </td>
    </tr>
    <tr>
        <td class="auto-style5">
            <label>Father's Name</label>
        </td>
        <td style="width:100px">
            <telerik:RadTextBox ID="txtFathersName" Runat="server" EmptyMessage="Father's Name" LabelWidth="64px" Resize="None" Width="160px" DisabledStyle-BackColor="Silver">
            </telerik:RadTextBox>
        </td>
        <td>
            <asp:CustomValidator runat="server" ID="NOT_WORKING_VALIDATOR" ControlToValidate="txtFathersName" ValidateEmptyText="True"
                ClientValidationFunction="RequiredIfIndividual"
                ErrorMessage="<img src='images/Exclamation.png' Title='Required Field'/>" EnableClientScript="True">
            </asp:CustomValidator>

        </td>
    </tr>
</table>
</asp:Panel>

Ниже приведен javascript:

<script type="text/javascript">
    function RequiredIfIndividual(sender, args) {
        var chkBoxIndividual = $find("<%=rdBtnIndividual.ClientID%>");
        chkBoxIndividual = $telerik.toButton(chkBoxIndividual);
        if (chkBoxIndividual.get_checked()) {
            if (args.Value == "") {
                args.IsValid = false;
            }
            else {
                args.IsValid = true;
            }
        } else {
            args.IsValid = true;
        }
    }

</script>

person Lefteris    schedule 07.11.2013    source источник


Ответы (2)


Потратив некоторое время на устранение этой проблемы, мне удалось найти первопричину проблемы.

Проблема связана с новым ненавязчивым режимом проверки .NET 4.5. Для правильной работы требуется jQuery 2.0. Это стандартно в .NET 4.5. Однако встроенная версия jQuery в RadControls (по крайней мере до версии 2013Q3) - v1.9.1 (см. здесь). В результате CustomValidator больше не работает должным образом.

Этому есть две альтернативы - я успешно попробовал только первую:

  1. Отключите ненавязчивый режим проверки. Для этого вам нужно включить следующую строку в раздел <appSettings> файла web.config:

    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />

    Оборотная сторона: ненавязчивый режим проверки предназначен для использования новых функций HTML5, чтобы исключить код javascript, сгенерированный для выполнения проверки, в результате чего страницы становятся более светлыми (см. здесь). Отключив его, вы не сможете использовать эту функцию.

  2. Выберите не использовать встроенную версию jQuery для RadControls (например, v1.9.1) и используйте версию, предоставляемую .NET 4.5 (например, v2.0).

    Оборотная сторона: проблема в том, что RadControls был протестирован с использованием встроенной версии jQuery, и вы можете столкнуться с проблемами. Чтобы отключить встроенную версию jQuery, перейдите по этой ссылке

Надеюсь, это поможет следующему человеку, который столкнется с той же проблемой.

person Lefteris    schedule 24.11.2013
comment
ты человек. Спасибо за публикацию. Я уже 2 часа ломаю голову по этому поводу. объяснил это прекрасно. - person kman; 15.01.2014
comment
Привет @Lefteris, я столкнулся с той же проблемой, но в моем случае я использую .Net 4.0, а не 4.5. Пользовательская функция JS-валидатора никогда не запускается. Ох, и я использую элемент ValidationSummary для отображения ошибок. Какие-либо предложения? - person Sergiu; 23.09.2015
comment
Комментарий Per @ ian-grainger в другом ответе, аналогичный симптом также может быть вызван устаревшим флагом в web.config. stackoverflow.com/a/656290/3196753 - person tresf; 11.01.2019

Вам необходимо вручную вызвать функцию ValidatorValidate и передать экземпляр настраиваемого валидатора из обработчиков rdBtnPhysical_CheckedChanged и rdBtnLegal_CheckedChanged. Ниже я подготовил для вас небольшой пример:

  <script type="text/javascript">
            function RequiredIfIndividual(sender, args) {
                var chkBoxIndividual = $find("<%=rdBtnIndividual.ClientID%>");
                chkBoxIndividual = $telerik.toButton(chkBoxIndividual);
                if (chkBoxIndividual.get_checked()) {
                    if (args.Value == "") {
                        args.IsValid = false;
                    }
                    else {
                        args.IsValid = true;
                    }
                } else {
                    args.IsValid = true;
                }
            }

            function rdBtnPhysical_CheckedChanged(sender, args) {
                ValidatorValidate($get("NOT_WORKING_VALIDATOR"));
            }

            function rdBtnLegal_CheckedChanged(sender, args) {
                ValidatorValidate($get("NOT_WORKING_VALIDATOR"));
            }

        </script>

Я только что протестировал код, и, похоже, он работает нормально.

person Genady Sergeev    schedule 08.11.2013
comment
Большое спасибо также за предоставленный фрагмент кода. Это очень полезно. И последний вопрос: это нормальный, задокументированный способ использования CustomValidator или это скорее обходной путь? - person Lefteris; 08.11.2013
comment
Документация Microsoft по этой теме очень расплывчата. Мне лично никогда не удавалось заставить настраиваемый валидатор работать с пустым текстовым полем, если он не был вызван явно. Я считаю, что свойство ValidateEmptyText больше подходит для серверной части валидатора. - person Genady Sergeev; 08.11.2013
comment
Мой не работал из-за ‹xhtmlConformance mode = Legacy /› в Web.config. Я имею в виду, очевидно! Благодаря этому ответу я нашел его: stackoverflow.com/a/656290/48348 - person Ian Grainger; 20.10.2015