Asp.net mvc 4 如何验证MVC4中的复选框组
我的视图模型中有以下属性Asp.net mvc 4 如何验证MVC4中的复选框组,asp.net-mvc-4,unobtrusive-validation,Asp.net Mvc 4,Unobtrusive Validation,我的视图模型中有以下属性 public IList<KeyWordViewModel> KeyWords { get; set; } 你有它,只是缺少实际的客户端部分。请记住,您在服务器端编写的内容不会自动转换为客户端javascript。您可以使用AJAX检查,但是(IMHO)会将不必要的查询放在混合中(特别是对于这样一个简单的检查) 要添加客户端验证程序,您可以在页面上放置如下内容: $.validator.addMethod('checklistrequired', func
public IList<KeyWordViewModel> KeyWords { get; set; }
你有它,只是缺少实际的客户端部分。请记住,您在服务器端编写的内容不会自动转换为客户端javascript。您可以使用AJAX检查,但是(IMHO)会将不必要的查询放在混合中(特别是对于这样一个简单的检查) 要添加客户端验证程序,您可以在页面上放置如下内容:
$.validator.addMethod('checklistrequired', function(value, element){
// check the values selected and return an outcome
});
然后,这将连接到您的
ModelClientValidationRule.ValidationType
,它被指定为checklist required
,谢谢您的建议,但我已经准备好了代码,仍然无法工作。服务器端验证工作没有任何问题。很抱歉,在回答中没有看到它,也不知道您有它。话虽如此,您在页面加载时是否遇到任何JS错误?可以是鸡也可以是蛋:验证库的顺序是什么?首先是/Common/Scripts/jquery.validate.unobtrusive.js(所有其他与jquery相关的文件在此之前),然后是脚本块。事实上,脚本块是页面上的最后一个内容。我相信您首先需要jquery.validate.js
,然后是用户定义的验证,然后是jquery.*.unobtrusive*.js
。通过这种方式,验证对象存在,您添加自定义逻辑,然后unobtrusive将所有内容连接起来(您的自定义验证器现在可用)。我刚刚这样做,并得到“Microsoft JScript运行时错误:'validator.unobtrusive.adapters'为null或不是对象”
public class CheckListRequiredAttribute : ValidationAttribute, IClientValidatable
{
int _min;
int _max;
string _propertyName;
public CheckListRequiredAttribute(int min = 1, int max = int.MaxValue, string propertyName = "Checked")
{
this._min = min;
this._max = max;
this._propertyName = propertyName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
IList list;
if (value == null)
{
return null;
}
if (value.GetType().Name == typeof(List<>).Name || value.GetType().Name == typeof(IList<>).Name)
{
list = (IList)value;
}
else
{
list = new object[] { value };
}
if (list.Count < 0)
return null;
var checkedItems = (from object item in list let propertyInfo = item.GetType().GetProperties() from info in propertyInfo where String.Equals(info.Name, _propertyName) && (bool)info.GetValue(item, null) == true select item).ToList();
if (checkedItems.Count >= _min && checkedItems.Count <= _max)
{
return null;
}
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "checklistrequired"
};
}
}
$(function () {
jQuery.validator.unobtrusive.adapters.add('checklistrequired', {}, function (options) {
options.rules['checklistrequired'] = {};
if (options.message) {
options.messages['checklistrequired'] = options.message;
}
});
jQuery.validator.addMethod('checklistrequired', function (value, element, params) {
alert("Testing cb validation");
return false;
}, 'Please check at least one box.');
} (jQuery));
$.validator.addMethod('checklistrequired', function(value, element){
// check the values selected and return an outcome
});