MVC小系列(十七)【自定义验证规则给下拉框】
因为下拉框不支持验证,所以写一个attribute特性,让它继承ValidationAttribute
mvc的特性验证,很直接,无论是数据安全特性上还是页面表现上都不错,
它的运行机制: 前台表单验证规则有个名称,然后前台js有对这个规则编写的代码,用来控制前台html标记的显示,而后台主要是生成验证规则和向前台参数赋值的,
mvc的验证不是简单的后台验证,一般继承到了 jquery.validate.min.js里
第一步 写后台验证规则,可能需要这样
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class NotDefaultValueAttribute : ValidationAttribute, IClientValidatable { public string InputString { get; set; } public NotDefaultValueAttribute() { ErrorMessage = "请选其中一项"; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ModelClientValidationRule rule = new ModelClientValidationRule { ValidationType = "notdefaultvalue", ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()) }; rule.ValidationParameters["inputstring"] = InputString; yield return rule;//按需取值 } public override bool IsValid(object value) { if (value == null) return true; string inputString = (string)value; if (inputString.Contains(InputString)) { return false; } return true; } }
第二步在model层加上验证:
[NotDefaultValue(InputString = "1")]/*如果用户选择为1,则验证不通过*/ public IList<SelectListItem> ActiveCategories { get; set; }
第三步 在前台添加相应的js代码:
<script> $.validator.addMethod('notdefaultvalue', function (value, element, param) { if (value == false) { return true; } if (value.indexOf(param) != -1) { return false; } else { return true; } }); $.validator.unobtrusive.adapters.addSingleVal('notdefaultvalue', 'inputstring'); </script>