自定义客户端validation至少需要一个数组

我有以下自定义属性,用于validation数组是否已提交值:

[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 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 }; } } 

应用于

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

以下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); 

我试过更改addMethodreturn false; 但这仍然无效(我的控制台没有错误)

我想知道是否有人可以发现我上面的代码做错了。 我用地址属性做了类似的事情,它工作正常,但由于某种原因,我不能让这个工作?

此外,服务器端validation工作。

用于validation消息的Razor代码

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

示例html用于呈现的复选框:

   

编辑

此外,我现在可以使用以下方法使客户端validation工作

 $.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错误消息

所以这是通过对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 addBool设置错误消息。