自定义客户端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);
我试过更改addMethod
只return 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
设置错误消息。
- MVC4和IClientValidatable – 自动AJAX调用服务器端validation
- 未捕获的TypeError:undefined不是函数
- jQuery POST,错误405方法不允许
- 如何实现在MVC和jquery中为FileUploading附加更多文件
- jQuery validate()MVC 4未捕获类型错误对象没有方法’validate’
- jQuery Ajax无法调用MVC 4 Controller方法
- 从嵌套集合中添加/删除MVC4(使用jQuery?)
- 如何将选定列表项的字符串值参数从自动填充的下拉列表传递到MVC 4中的部分视图控制器?
- 使用jQuery Ajax和Html.AntiForgeryToken()时,防伪表单字段“__RequestVerificationToken”不存在