Ненавязчивая проверка не срабатывает на переключателях - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь получить форму для проверки в JavaScript с помощью включенного jQuery.Validate.Текст и выбранные входные данные корректно проверяются в JavaScript, но любые группы переключателей, которые я включаю в форму, проверяются только на сервере.Как я могу заставить клиента работать?Ниже приведен фрагмент моего взгляда:

@Html.AccessibleValidationMessageFor(m => m.DeliveryMethod)
@foreach (var deliveryMethod in Model.GetDeliveryMethodsOrdered())
{
    @Html.AccessibleRadioButtonFor(m => m.DeliveryMethod, deliveryMethod.Id, new { id = string.Format("DeliveryMethod_{0}", deliveryMethod.Id) })
    <label for="DeliveryMethod_@deliveryMethod.Id">@deliveryMethod.Description</label>
}

Я использую некоторые расширения встроенных помощников HTML, но я не думаю, что это вызывает проблему, поскольку я также пытался использовать встроенный@Html.RadioButtonFor и @Html.ValidationMessageFor помощники.На всякий случай вот пользовательский вспомогательный код.

    public static IHtmlString AccessibleRadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, object values, object htmlAttributes = null)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);



        var fieldName = ExpressionHelper.GetExpressionText(expression);
        var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
        var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata);
        if (!html.ViewData.ModelState.IsValidField(fullBindingName))
        {
            if (!validationAttributes.ContainsKey("aria-describedby"))
            {
                validationAttributes.Add("aria-describedby", fullBindingName.ToLower() + "-valMsg");
                validationAttributes.Add("aria-invalid", "true");
            }
        }

        RouteValueDictionary routeValues = new RouteValueDictionary(htmlAttributes);
        if (routeValues != null)
        {
            foreach (var attribute in validationAttributes)
            {
                routeValues.Add(attribute.Key, attribute.Value);
            }
            return html.RadioButtonFor(expression, values, routeValues);
        }
        return html.RadioButtonFor(expression, values, validationAttributes);
    }

В модели я сделал тип обнуляемым и добавил обязательный атрибут.

    [Required]
    [Display(Name = "Delivery Method")]
    public int? DeliveryMethod { get; set; }

С этой настройкойПереключатель отображается как:

<input aria-describedby="deliverymethod-valMsg" aria-invalid="true" 
    class="input-validation-error" data-val="true" data-val-number="The field Delivery Method must be a number." 
    data-val-required="The Delivery Method field is required." id="DeliveryMethod_-1" 
    name="DeliveryMethod" type="radio" value="-1">

Я испробовал несколько идей:

  • Превращение типа модели в обычный int или string
  • Создание настраиваемого атрибута проверки и его применение к свойству модели.
  • Как я уже говорил выше, замена настраиваемых помощников встроенными версиями с целью выявления причины.

Все это дало мне тот же результат, радио-кнопка будет корректно проверяться на стороне сервера, но никогда на клиенте.В настоящее время я пытаюсь выполнить отладку в файле jquery.validate.js, и похоже, что требуемая функция валидатора никогда не вызывается ни на каких переключателях, если это помогает сузить круг.Если кто-нибудь знает, как это сделать, я был бы признателен за помощь.Спасибо!

1 Ответ

0 голосов
/ 22 июня 2019

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

Исправление оказалось, что каждый из них получал всего 1 пиксель, высоту и ширину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...