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
更改为justreturn 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
方法。我还将classrequired 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);