ASP.NET MVC5验证系列之Fluent Validation
前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便。而客户端的验证,必须要启用客户端验证,也就是在配置文件中配置相应的节点,并且还要引入jquery插件。如果人为的在浏览器上,禁用了js脚本,那么客户端验证就不起作用了,所以在这里,我将继续学习另外一个验证,也就是fluent validation。
fluent validation是一个开源的.net类库,它使用fluent接口和lambda表达式,来为实体做验证。fluent validation是专门为实体做验证使用的。它的优点是:把验证逻辑和你代码的业务逻辑分别开了。这就是aop的思想。就是横切关注点。你只需要关注某一个模块。这样就保证了代码的纯洁度。
fluent validation开源地址:https://github.com/jeremyskinner/fluentvalidation
例句:
aspect-oriented program is a new software development paradigm that enables modular implementation of cross-cutting concerns,and poses difficulties for slicing of aspect-oriented programs.
面向方面程序设计作为一种新的软件开发范型,能够实现横切关注点的模块化,其特有的语言元素和功能为切片增加了难度。
好了,废话太多,直接进入正题,
首先我们新建一个空白的mvc项目:在model文件夹下新建一个类customer:
using system; using system.collections.generic; using system.linq; using system.web; namespace server_side_validation_in_mvc.models { public class customer { public string name { get; set; } public string email { get; set; } } }
然后新建一个文件夹validator,在里面添加一个类customervalidator
既然是要使用fluent validation,那么就是要引用它的类库了。
customervalidator类中,继承abstractvalidator抽象类,(ps:这里和ef中的fluent api类似,ef中是继承entitytypeconfiguration类)
using fluentvalidation; using server_side_validation_in_mvc.models; using system; using system.collections.generic; using system.linq; using system.web; namespace server_side_validation_in_mvc.validator { public class customervalidator:abstractvalidator<customer> { public customervalidator() { rulefor(s => s.name).notempty().withmessage("名字不能为空"); rulefor(s => s.email).notempty().withmessage("电子邮件不能为空"); rulefor(s => s.email).emailaddress().withmessage("电子邮件格式不合法"); } } }
控制器中的代码:
using fluentvalidation.results; using server_side_validation_in_mvc.models; using server_side_validation_in_mvc.validator; using system; using system.collections.generic; using system.linq; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.controllers { public class customercontroller : controller { // get: customer public actionresult index() { return view(); } [httppost] public actionresult index(customer model) { customervalidator validator = new customervalidator(); validationresult result = validator.validate(model); if (result.isvalid) { viewbag.name = model.name; viewbag.email = model.email; } else { foreach (var item in result.errors) { modelstate.addmodelerror(item.propertyname, item.errormessage); } } return view(model); } } }
修改一下,默认的路由:
public static void registerroutes(routecollection routes) { routes.ignoreroute("{resource}.axd/{*pathinfo}"); routes.maproute( name: "default", url: "{controller}/{action}/{id}", defaults: new { controller = "customer", action = "index", id = urlparameter.optional } ); }
什么都不输入,直接点击create:
输入name,不输入email
输入name,email输入非法的数据
输入合法的数据:
这里就完成了fluent validation验证。大家可以看到,这样的验证是不是干净简洁多了,配置信息都在一个类中,方便维护和扩展。不想数据注解那样,把验证信息和实体混合了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。