上面介绍了ASP.NET MVC中的模型验证,其内置了一些常用的验证方式,但是在实际开发中仍然会出现无法满足需求的情况,所以在这些情况下就需要根据实际需求来自定义验证,包括后端验证与前端验证。
1、添加自定义验证特性:
上面代码需要注意以下几点:
● 实现了ValidationAttribute类型并重写了用于获取错误信息的FormatErrorMessage方法以及用于验证数据的IsValid方法。
● 实现了System.Web.Mvc命名空间下的IClientValidatable接口,该接口是ASP.NET MVC拓展的用于实现客户端验证的接口,该接口用于创建并返回一个验证规则列表,该验证规则主要包含了错误信息、验证类型、验证参数三个属性,其中错误信息在默认的信息中添加了“来自客户端验证”用于区分服务端验证。
注:由于客户端验证仅仅是ASP.NET MVC中的特性,所以IClientValidatable接口存在与System.Web.Mvc程序集中。
2、拓展Jquery Validation插件,添加一个名为myblog.validate.extension.js的验证拓展文件,并对Jquery validation添加新的验证方法(注:方法第一个参数与GetClientValidationRules方法中设置的ValidationType属性一致),最后通过jQuery.validator.unobtrusive.adapters添加MVC与Jquery Validation的关联:
注:添加关联代码时需要添加名称与ValidationType属性一致的messages及rules。
3、将拓展的js文件引入页面中:
bundleConfig.cs:
页面代码:
4、将新添加的特性应用到相应的类型属性上:
5、执行结果:
小结
数据验证对于应用程序来说是一个非常重要的功能,从本文的分析中可以看出,一个数据可能会在客户端录入时、服务器接收时以及业务逻辑处理时对其进行验证,那么可能会有疑问这些代码是否是重复的没必要的,答案是否定的,首先对于服务器来说所有来自客户端的数据都是不可信的,所以无论数据在浏览器中是否被验证过,都需要在服务端进行验证,而对于业务逻辑来说,它是一个整体,它自己本身就规定了什么数据是合法的什么是非法的,所以其本身就必须包含验证逻辑,否则该业务逻辑的单元测试都无法通过,而最后对于服务端的Model验证来说,它做为请求的接收者,决定了是否执行相应的业务逻辑,它们即独立又存在联系。
另外文中还对涉及到的Unobtrusive Javascript进行了简要介绍,非侵入式JavaScript是一种思想,除了这里的数据验证外还可以将其用于其它地方。接下来的文章将对ASP.NET MVC如何将HTTP请求的数据绑定到Model进一步说明。
参考:
https://www.codeproject.com/articles/826304/basic-introduction-to-data-annotation-in-net-frame
https://www.codeproject.com/Articles/1184173/DataAnnotations-in-Depth
https://www.codeproject.com/Articles/287278/Unobtrusive-Validation-with-ASP-NET
https://www.cnblogs.com/Leo_wl/p/4886622.html