ASP.NET MVC4 - проверка скрытого поля не очищается после установки значения

У меня есть скрытое поле в моей форме, которое является обязательным. Скрытое поле заполняется, когда пользователь выбирает значение из текстового поля с помощью автозаполнения пользовательского интерфейса jQuery. Я настроил свой валидатор формы, чтобы он не игнорировал скрытые поля, чтобы проверка действительно работала. Проверка работает, но когда пользователь выбирает нужную опцию из автозаполнения, которое затем заполняет скрытое поле, сообщение проверки не исчезнет и будет отображаться до тех пор, пока форма не будет опубликована. Нужно ли мне вручную вызывать $('form').validate() или что-то еще после установки скрытого поля, или есть ли способ очистить это без дополнительного кода javascript?

Моя модель просмотра:

public class IndexViewModel
{
    public string SchoolName { get; set; }
    [Required]
    public int SchoolId { get; set; }
}

Мой взгляд:

@model IndexViewModel

@using (Html.BeginForm())
{
    <p>
        @Html.LabelFor(m => m.SchoolName)
        @Html.TextBoxFor(m => m.SchoolName)
        @Html.HiddenFor(m => m.SchoolId)
        @Html.ValidationMessageFor(m => m.SchoolId)
    </p>

    <p>
        <input type="submit" />
    </p>
}

@section scripts {
    <script>
        $(function () {
            // stop validator from ignoring hidden fields
            var validator = $('form').data('validator');
            validator.settings.ignore = "";

            // schoolname autocomplete
            $('#SchoolName').autocomplete({
                minLength: 1,
                source: [
                    { label: "ABC University", value: "1" },
                    { label: "Oklahoma University", value: "2" },
                    { label: "Texas University", value: "3" }
                ],
                select: function (e, ui) {
                    e.preventDefault();
                    $('#SchoolId').val(ui.item.value);
                    $('#SchoolName').val(ui.item.label);
                }
            });
        });
    </script>
}

Заранее спасибо.


Изменить

Спарки, вот отрендеренный HTML:

<form action="/" method="post">
    <p>
        <label for="SchoolName">SchoolName</label>
        <input id="SchoolName" name="SchoolName" type="text" value="" />
        <input data-val="true" data-val-number="The field SchoolId must be a number." data-val-required="The SchoolId field is required." id="SchoolId" name="SchoolId" type="hidden" value="" />
        <span class="field-validation-valid" data-valmsg-for="SchoolId" data-valmsg-replace="true"></span>
    </p>
    <p>
        <input type="submit" />
    </p>
</form>

comment
Я думаю это поможет тебе.   -  person Rajesh Dhiman    schedule 27.02.2014
comment
Вы должны показать нам рендеринг HTML формы, как ее видит браузер.   -  person Sparky    schedule 27.02.2014


Ответы (1)


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

Однако вы можете программно запустить проверочный тест для любого поля, вызвав метод .valid() в любое время.

$('input[name="field"]').valid();  // force validation of 'input name="field"'

Вот грубая демонстрация jsFiddle: http://jsfiddle.net/LJzfu/

  • Нажмите «Отправить», чтобы отобразить «требуемое» сообщение о скрытом вводе с именем field2, которое не имеет значения.

  • Нажатие кнопки «перейти» программно помещает значение в скрытый ввод. Форма теперь технически проходит проверку (при отправке), но сообщение об ошибке остается, потому что у нас нет триггера проверки.

  • Активируйте проверку, вызвав .valid() сразу после ввода значения в скрытое поле. Это вызывает проверочный тест скрытого поля, который затем скрывает сообщение об ошибке (до тех пор, пока выполняются правила проверки).

person Sparky    schedule 27.02.2014
comment
Работал как шарм. Не был уверен, какой метод вызвать, поэтому спасибо, что указали мне правильное направление! - person ryanulit; 27.02.2014