Я пытаюсь получить форму для проверки в 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
, и похоже, что требуемая функция валидатора никогда не вызывается ни на каких переключателях, если это помогает сузить круг.Если кто-нибудь знает, как это сделать, я был бы признателен за помощь.Спасибо!