Jquery 阵列中至少需要一个的自定义客户端验证

Jquery 阵列中至少需要一个的自定义客户端验证,jquery,asp.net-mvc-4,jquery-validate,unobtrusive-validation,Jquery,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,我有以下自定义属性,用于验证数组是否已提交值: [AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] public sealed class RequiredArrayAttribute : RequiredAttribute, IClientValidatable { public RequiredArrayAttribute() : base()

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

[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 };
    }
}
我已尝试将
addMethod
更改为just
return false但这仍然不起作用(在我的控制台中没有错误)

我想知道是否有人能发现我在上面的代码中做错了什么。我用address属性做了类似的事情,它工作得很好,但由于某种原因,我不能让这个工作

除此之外,服务器端验证也起作用

验证消息的Razor代码

@Html.ValidationMessageFor(m => m.ProductIds)
呈现复选框的html示例:

<input type="checkbox" class="checkbox" name="ProductIds" value="EXAMPLEID1234" id="checkbox-1" checked="checked" />
<input type="checkbox" class="checkbox" name="ProductIds" value="EXAMPLEID1235" id="checkbox-2" checked="checked" />
而不是上面的
validator.unobtrusive.adapters.addBool
方法。我还将class
required group
添加到复选框中

但是,如果我使用它,它不会添加正确的MVC错误消息,只是
客户端不应该像上面代码中设置的那样回发
。我已尝试将以下属性添加到复选框:

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

并且还尝试使用
data val requiredarray
,但这没有任何区别,因此是否有人知道如何更改上面的客户端规则,使其使用MVC错误消息

,因此这通过对html的以下更改得到修复:

<input type="checkbox" class="checkbox required-group" name="ProductIds" value="EXAMPLEID1234" id="checkbox-1" checked="checked" data-val-required="Please select at least one sample" />
<input type="checkbox" class="checkbox required-group" name="ProductIds" value="EXAMPLEID1235" id="checkbox-2" checked="checked" />

我已将
addBool
更改为
addClassRules
,然后使用
$.validator.messages
设置错误消息

显示所有相关内容的呈现代码。呈现的
.validate()
方法在哪里?整个表单的呈现HTML在哪里?@Sparky MVC处理所有验证内容,因此没有用于验证的代码。对于完整表单,它只是许多相同的复选框,在末尾有一个提交按钮。我意识到这一点。然而,jqueryvalidate仍然是JavaScript,如果不先初始化它就不能运行。初始化方法是
.validate()
。因此必须有
.validate()
方法呈现在客户端某处。。。可能在包含的js文件中。这可能不是答案。但是,为什么要在自定义方法中构造选择器?您认为
元素
参数代表什么?它是选择器本身。不必要地循环使用给定元素,找到它的名称,然后使用该名称来查找您首先已经拥有的元素。该选择器应该为我选中所有具有该名称的复选框。我以为元素只是当前元素,但已选中/未选中
$.validator.addClassRules('required-group', { 'requiredarray': true });
 data-val="true" data-val-required="Please select at least one sample"
<input type="checkbox" class="checkbox required-group" name="ProductIds" value="EXAMPLEID1234" id="checkbox-1" checked="checked" data-val-required="Please select at least one sample" />
<input type="checkbox" class="checkbox required-group" name="ProductIds" value="EXAMPLEID1235" id="checkbox-2" checked="checked" />
(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);