Пользовательская проверка клиента для требуемого по крайней мере одного массива

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

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class RequiredArrayAttribute : RequiredAttribute, IClientValidatable
{
 public RequiredArrayAttribute()
 : base()
 {
 }

 public override bool IsValid(object value)
 {
 var list = (IList)value;

 if (list != null && list.Count > 0)
 {
 return true;
 }

 return false;
 }

 public IEnumerable<modelclientvalidationrule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
 {
 string errorMessage = this.ErrorMessage;

 // Get the specific error message if set, otherwise the default
 if (string.IsNullOrEmpty(errorMessage) && metadata != null)
 {
 errorMessage = FormatErrorMessage(metadata.GetDisplayName());
 }

 var clientValidationRule = new ModelClientValidationRule()
 {
 ErrorMessage = errorMessage,
 ValidationType = "requiredarray"
 };

 return new[] { clientValidationRule };
 }
}
</modelclientvalidationrule>

Применительно к

[RequiredArray(ErrorMessage = "Please select at least one product")]
public IEnumerable<string> ProductIds { get; set; }
</string>

И следующие js (включены после jquery.js, unobtrusive-ajax.js, validate.js и validate.unobtrusive.js)

(function ($) {
 $.validator.addMethod('requiredarray', function (value, element, params) {
 var selector = 'input[name=' + $(element).attr('name') + ']:checked';
 return $(selector).length > 0;
 }, 'Clientside Should Not Postback');

 $.validator.unobtrusive.adapters.addBool('requiredarray');
})(jQuery);

Я попытался изменить addMethod чтобы просто return false; но это все еще ничего не делает (и никаких ошибок в моей консоли)

Мне было интересно, может ли кто-нибудь обнаружить что-то, что я сделал неправильно с вышеуказанным кодом. Я сделал аналогичную вещь с атрибутом адреса, и она работает нормально, но по какой-то причине я не могу заставить ее работать?

Кроме того, валидация на стороне сервера работает.

Код бритвы для подтверждения

@Html.ValidationMessageFor(m => m.ProductIds)

Пример html для отображаемых флажков:

РЕДАКТИРОВАТЬ

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

$.validator.addClassRules('required-group', { 'requiredarray': true });

вместо метода validator.unobtrusive.adapters.addBool в приведенном выше. Я также добавил класс required-group к флажку

Однако, если я использую это, он не добавляет правильное сообщение об ошибке MVC, просто Clientside Should Not Postback как указано в приведенном выше коде. Я попытался добавить к этому флажку следующие атрибуты:

data-val="true" data-val-required="Please select at least one sample"

а также попытался использовать data-val-requiredarray но это не имеет никакого значения, так что кто-нибудь знает, как изменить вышеупомянутые правила для клиентов, чтобы заставить его использовать сообщение об ошибке MVC

1 ответ

Таким образом, это было исправлено со следующими изменениями в html:

data-val-required только для первого флажка в массиве. Затем, используя следующий jQuery:

(function ($) {
 $.validator.addMethod('requiredarray', function (value, element, params) {
 return $('input[name=' + $(element).attr('name') + ']:checked').length > 0;
 }, 'Please select at least one');

 $.validator.addClassRules('required-group', { 'requiredarray': true });

 var errorMessage = $('.required-group').eq(0).data('val-requiredarray');
 if (errorMessage && errorMessage !== "") {
 $.validator.messages.requiredarray = errorMessage;
 }
})(jQuery);

Я изменил addBool на addClassRules а затем использовал $.validator.messages чтобы установить сообщение об ошибке.

licensed under cc by-sa 3.0 with attribution.