在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
从ASP.NET MVC2开始,MVC新增了元数据级别的验证,例如:Range、RegularExpression、Required、StringLength等验证属性,这些属性极大的方便了服务器端的验证,同时我们还可以自定义验证属性来满足我们特殊的需求,MVC3的出现进一步提升了验证的便捷性,具体体现在,新增了IValidatableObject和IClientValidatable接口,以及默认支持Range、RegularExpression、Required、StringLength等验证属性在客户端和服务器端进行验证。 IValidatableObject接口,网上已经有很多的资料了,今天我主要介绍IClientValidatable这个接口,IClientValidatable 接口允许 ASP.NET MVC 在运行时发现支持的客户端验证器,这个接口被用来支持集成不同的验证框架——摘自:ASP.NET MVC3概述。 下面我们就来看看如何使用IClientValidatable接口来实现客户端和服务器端的验证。 首先我们来自定义一个验证属性NoIsAttribute.cs,该属性的主要作用是验证用户名中不能含有指定的字符串,代码如下: public sealed class NoIsAttribute:ValidationAttribute { public string InputString { get; set; } public NoIsAttribute() { ErrorMessage = "验证失败"; } public override bool IsValid(object value) { if (value == null) return true; string inputString = (string)value; if (inputString.Contains(InputString)) { return false; } return true; } }
public class Logon { [DisplayName("年龄")] [Range(6,100)] public int Age { get; set; } [DisplayName("姓名")] [NoIs(InputString="卜俊生",ErrorMessage="用户名不能含有卜俊生")] public string Name { get; set; } }
public sealed class NoIsAttribute:ValidationAttribute,IClientValidatable { public string InputString { get; set; } public NoIsAttribute() { ErrorMessage = "验证失败"; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ModelClientValidationRule rule = new ModelClientValidationRule { ValidationType = "nois", 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; } } IClientValidatable 接口很简单,他只有一个GetClientValidationRules()方法,我们只要实现这个方法就可以了,这个方法包括两个参数,metadata表示要验证的属性的元数据,context表示发送请求的Controller的上下文,并且它返回一个ModelClientValidationRule集合。 我们先来看看这段代码: ModelClientValidationRule rule = new ModelClientValidationRule { ValidationType = "nois", ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()) }; 这段代码是创建一个ModelClientValidationRule对象,并且为其两个属性赋值,其中ValidationType是验证类型(客户端代码需要调用该属性),ErrorMessage是错误信息。 让后我们再来看看下面这句代码: rule.ValidationParameters["inputstring"] = InputString;
这句代码的意思是添加一个验证属性”inputstring”,它的值是InputString,需要注意的是ValidationParameters是一个IDictionary<string,object>字典,最重要的是ValidationParameters的key必须是小写的,不能包含任何大写字母,否则运行时会报错,请一定要谨记。 IClientValidatable.cs完成后,我们还需要编写客户端代码才能实现客户端和服务器端同时验证。 默认情况下asp.net mvc3已经开启了客户端验证和隐藏验证,这一点我们可以在web.config中查看 <appSettings> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> </appSettings>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript"> $.validator.addMethod("nois", function (value, element, param) { if (value == false) { return true; } if (value.indexOf(param) != -1) { return false; } else { return true; } }); $.validator.unobtrusive.adapters.addSingleVal("nois","inputstring"); </script>
这样就可实现客户端和服务器端同时验证了,有兴趣的朋友可以试下。 |
请发表评论