包介绍 - Fluent Validation (用于验证)

Install-Package FluentValidation

如果你使用MVC5 可以使用下面的包

Install-Package FluentValidation.MVC5

例子:

public class CustomerValidator : AbstractValidator<Customer>
    {
        public CustomerValidator()
        {
            //不能为空
            RuleFor(customer => customer.Surname).NotEmpty();

            //自定义提示语
            RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Pls specify a first name");

            //有条件的判断
            RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);

            //字符串长度的限制
            RuleFor(customer => customer.Address).Length(20, 250);

            //使用自定义验证器
            RuleFor(customer => customer.PostCode).Must(BeAValidPostCode).WithMessage("Pls specify a valid postCode");

        }

        /// <summary>
        /// 自定义验证
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private bool BeAValidPostCode(string arg)
        {
            throw new NotImplementedException();
        }
    }
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;

  

在一个属性上应用链式验证

public class CustomerValidator : AbstractValidator<Customer> {
  public CustomerValidator {
    RuleFor(customer => customer.Surname).NotNull().NotEqual("foo");
  }
}

抛出例外

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();

validator.ValidateAndThrow(customer);

在复杂属性里面使用验证

public class Customer {
  public string Name { get; set; }
  public Address Address { get; set; }
}

public class Address {
  public string Line1 { get; set; }
  public string Line2 { get; set; }
  public string Town { get; set; }
  public string County { get; set; }
  public string Postcode { get; set; }
}
public class AddressValidator : AbstractValidator<Address> {
  public AddressValidator() {
    RuleFor(address => address.Postcode).NotNull();
    //etc
  }
}
public class CustomerValidator : AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Name).NotNull();
    RuleFor(customer => customer.Address).SetValidator(new AddressValidator())
  }
}

在集合属性中使用Validator

public class OrderValidator : AbstractValidator<Order> {
    public OrderValidator() {
        RuleFor(x => x.ProductName).NotNull();
        RuleFor(x => x.Cost).GreaterThan(0);
    }
}
public class CustomerValidator : AbstractValidator<Customer> {
    public CustomerValidator() {
        RuleFor(x => x.Orders).SetCollectionValidator(new OrderValidator());
    }
}

var validator = new CustomerValidator();
var results = validator.Validate(customer);

集合验证的错误信息如下

foreach(var result in results.Errors) {
   Console.WriteLine("Property name: " + result.PropertyName);
   Console.WriteLine("Error: " + result.ErrorMessage);
   Console.WriteLine("");
}
Property name: Orders[0].Cost
Error: ‘Cost‘ must be greater than ‘0‘.

Property name: Orders[1].ProductName
Error: ‘Product Name‘ must not be empty.

验证集合

RuleSet能让你选择性的验证某些验证组 忽略某些验证组

 public class PersonValidator : AbstractValidator<Person> {
  public PersonValidator() {
     RuleSet("Names", () => {
        RuleFor(x => x.Surname).NotNull();
        RuleFor(x => x.Forename).NotNull();
     });

     RuleFor(x => x.Id).NotEqual(0);
  }
}

下面的代码我们只验证Person的Surname和ForeName两个属性

var validator = new PersonValidator();
var person = new Person();
var result = validator.Validate(person, ruleSet: "Names");

一次验证多个集合

validator.Validate(person, ruleSet: "Names,MyRuleSet,SomeOtherRuleSet")

同样你可以验证那些没有被包含到RuleSet里面的规则  这些验证是一个特殊的ruleset 名为"default"

validator.Validate(person, ruleSet: "default,MyRuleSet")

正则表达式验证器

RuleFor(customer => customer.Surname).Matches("some regex here");

Email验证器

RuleFor(customer => customer.Email).EmailAddress();

覆盖默认的属性名

RuleFor(customer => customer.Surname).NotNull().WithName("Last name");

或者

public class Person {
  [Display(Name="Last name")]
  public string Surname { get; set; }
}

设置验证条件

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
});

写一个自定义属性验证器

public class ListMustContainFewerThanTenItemsValidator<T> : PropertyValidator {

	public ListMustContainFewerThanTenItemsValidator()
		: base("Property {PropertyName} contains more than 10 items!") {

	}

	protected override bool IsValid(PropertyValidatorContext context) {
		var list = context.PropertyValue as IList<T>;

		if(list != null && list.Count >= 10) {
			return false;
		}

		return true;
	}
}
public class PersonValidator : AbstractValidator<Person> {
    public PersonValidator() {
       RuleFor(person => person.Pets).SetValidator(new ListMustContainFewerThanTenItemsValidator<Pet>());
    }
}

与MVC集成

1.

protected void Application_Start() {
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    FluentValidationModelValidatorProvider.Configure();
}

2.

[Validator(typeof(PersonValidator))]
public class Person {
	public int Id { get; set; }
	public string Name { get; set; }
	public string Email { get; set; }
	public int Age { get; set; }
}

public class PersonValidator : AbstractValidator<Person> {
	public PersonValidator() {
		RuleFor(x => x.Id).NotNull();
		RuleFor(x => x.Name).Length(0, 10);
		RuleFor(x => x.Email).EmailAddress();
		RuleFor(x => x.Age).InclusiveBetween(18, 60);
	}
}

3.

[HttpPost]
	public ActionResult Create(Person person) {

		if(! ModelState.IsValid) { // re-render the view when validation failed.
			return View("Create", person);
		}

		TempData["notice"] = "Person successfully created";
		return RedirectToAction("Index");

	}

或者只验证指定的RuleSet

public ActionResult Save([CustomizeValidator(RuleSet="MyRuleset")] Customer cust) {
  // ...
}

或者只验证指定的属性

public ActionResult Save([CustomizeValidator(Properties="Surname,Forename")] Customer cust) {
  // ...
}

另外在验证的权限还有一个钩子 可以通过实现IValidatorInterceptor在验证的前后座一些工作

public interface IValidatorInterceptor {
    ValidationContext BeforeMvcValidation(ControllerContext controllerContext, ValidationContext validationContext);

    ValidationResult AfterMvcValidation(ControllerContext controllerContext, ValidationContext validationContext, ValidationResult result);
}

  

时间: 2024-11-06 06:20:46

包介绍 - Fluent Validation (用于验证)的相关文章

.NET业务实体类验证组件Fluent Validation

认识Fluent Vaidation. 看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真是一个天才的想法,后来才知道这个东西是一个开源的轻量级验证组建. Fluent Validation 翻译为:流畅验证 开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业务类的验证规则(A small validation library for .NET that uses a fluent in

Java8所有的包介绍(由英文文档翻译而来)

翻译了一天,终于把翻译任务的"Java 8所有的包介绍"翻译完了,收获也是非常大,了解了Java8中所有包的作用,对Java8有了一个整体的了解,另外也是提高了自身的阅读能力. http://code.csdn.net/translations/97 这是我参与的一个翻译项目"Java-SE8-API文档"翻译. 希望有更多的人参与到翻译当中,一起提高一起学习. ----------------------------------------------------

SpringMVC介绍之Validation

对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证.SpringMVC自身对数据在服务端的校验有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证,对于不合格的数据信息SpringMVC会把它保存在错误对象中,这些错误信息我们也可以通过SpringMVC提供的标签在前端JSP页面上进行展示. 使用Validator接口进行验证 在SpringMVC中提供了一个Validator接口,我们可以

SpringMVC使用hibrenate validation进行验证

本文有两点需要注意: 本文只讲述跟验证有关的代码,如果对其他springmvc不熟悉请先自行学习 本文将验证Book类中的name长度为2到10,isbn必须为13位 首先添加需要用到hibrenate的validation JAR包 百度云下载地址 链接:http://pan.baidu.com/s/1pJusKEv 密码:k6u9 用到的一个测试POJO类Book package com.elin4it.ssm.pojo; import org.hibernate.validator.con

Struts.xml配置中的包介绍

<package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success

家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)

家庭洗车APP --- Android客户端开发 之 网络框架包介绍(一) 上篇文章中给大家简单介绍了一些业务.上门洗车APP --- Android客户端开发 前言及业务简单介绍,本篇文章给大家介绍下网络框架.之前也了解过一些开源网络通讯架构.也大概看了一部分源代码.比方Afinal.Volley.AndBase.Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有非常多地方须要注意和优化.这里就不贴出来献丑了,感兴趣的朋友能够去查阅学习上面

MVC学习系列12---验证系列之Fluent Validation

前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便.而客户端的验证,必须要启用客户端验证,也就是在配置文件中配置相应的节点,并且还要引入Jquery插件.如果人为的在浏览器上,禁用了js脚本,那么客户端验证就不起作用了,所以在这里,我将继续学习另外一个验证,也就是Fluent Validation. Fluent Validation是一个开源的.NET

Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程

原创整理不易,转载请注明出处:Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程 代码下载地址:http://www.zuidaima.com/share/1778685765291008.htm 在<Struts2教程4:使用validate方法验证数据>中曾讲到使用validate方法来验证客户端提交的数据,但如果使用validate方法就会将验证代码和正常的逻辑代码混在一起,但这样做并不利于代码维护,而且也很难将过些代码用于其他程序的验证.在St

fluent validation

1.摘抄 认识Fluent Vaidation. 看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真是一个天才的想法,后来才知道这个东西是一个开源的轻量级验证组建. Fluent Validation 翻译为:流畅验证 开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业务类的验证规则(A small validation library for .NET that uses a flue