欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC5验证系列之Fluent Validation

程序员文章站 2023-11-24 15:27:28
前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护...

前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便。而客户端的验证,必须要启用客户端验证,也就是在配置文件中配置相应的节点,并且还要引入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 

ASP.NET MVC5验证系列之Fluent Validation

既然是要使用fluent validation,那么就是要引用它的类库了。 

ASP.NET MVC5验证系列之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 }
   );
  }

ASP.NET MVC5验证系列之Fluent Validation

什么都不输入,直接点击create:

ASP.NET MVC5验证系列之Fluent Validation

输入name,不输入email

ASP.NET MVC5验证系列之Fluent Validation

输入name,email输入非法的数据

ASP.NET MVC5验证系列之Fluent Validation

输入合法的数据:

ASP.NET MVC5验证系列之Fluent Validation

这里就完成了fluent validation验证。大家可以看到,这样的验证是不是干净简洁多了,配置信息都在一个类中,方便维护和扩展。不想数据注解那样,把验证信息和实体混合了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。