视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ASP.NET全栈开发教程之前后台校验结合详解
2020-11-27 22:34:57 责编:小采
文档

前言

在Web系统开发时,往往会有存在大量的交互操作,交互就必须校验数据的准确性啊,且不说一个字段可能存在多种校验,若一个表单提交有10个字段难道我们要对这10个字段分别写代码去校验吗?如果是这样,那每一个表单都要单独去写一份校验岂不是太痛苦了?

为了解决这个问题,聪明的程序员们开始了“偷懒”!

今天我们介绍一位在.NET平台下偷懒的——“FluentValidation”,正如其名,流利的验证,他将我们的验证开发工作变得流利甚至优美了起来。

接下来我们就来看看如何使用它吧。

首先我们使用nuget安装 FluentValidation

Nuget安装命令:Install-Package FluentValidation -Version 7.6.104

由于FluentValidation的验证是基于模型的,所以,我们先来建立一个Person

public class Person
 {
 /// <summary>
 /// 姓名
 /// </summary>
 public string Name { get; set; }
 /// <summary>
 /// 年龄
 /// </summary>
 public int Age { get; set; }
 /// <summary>
 /// 性别
 /// </summary>
 public bool Sex { get; set; }

 }

有了模型,要想验证模型,肯定得有验证器才行,于是我们在创建一个Person的验证器

public class PersonValidator : AbstractValidator<Person>
 {
 public PersonValidator()
 {
 this.RuleFor(p => p.Name)
 .NotEmpty()
 .WithMessage("名字不能为空");
 this.RuleFor(p => p.Age)
 .NotEmpty()
 .WithMessage("年龄不能为空!!");
 }
 }

验证器必须继承自AbstractValidator<T> ,泛型T表示该验证器验证的实体,在构造函数里通过this.RuleFor为指定的属性设置验证,在上述配置中为Person的Name和Age属性都设置了非空,并且给出了相应的错误消息。

现在实体有了,验证器也有了,就差东风了。

class Program
 {
 static void Main(string[] args)
 {
 Server(new Person { });

 Console.ReadKey(true);
 }

 private static void Server(Person model)
 {
 var validator = new PersonValidator();

 ValidationResult result = validator.Validate(model);
 if (!result.IsValid)
 {
 foreach (var failure in result.Errors)
 {
 //失败的属性名称,如错误信息
 Console.WriteLine("Property " + failure.PropertyName + " failed validation. Error was: " + failure.ErrorMessage);
 }
 }
 Console.WriteLine("验证完成!!");
 }
 }

在Server方法中需要一个参数Person,Person是个对象,里面有3个属性Name、Age、Sex,在Server内部我们创建了一个Person验证器对象,用它来验证我们的参数model,  验证后会返回一个验证结果。这个结果有2个重要的参数,第一是IsValid,验证通过的时候返回True,第二个是Errors,他里面存放的是所有验证失败的信息,在验证失败的时候通过遍历Errors即可获取到所有错误信息,如上所示通过错误信息的PropertyName就能知道是哪个对象出错了,而ErrorMessage自然就对应这个Property所出错内容的WithMessage了。下面是运行结果

 

至此,我们能够使用基本验证了。

但在我们实际应用中不一定会像上述案例一样一帆风顺,也许我们的Person里会有一个Address属性,他的类型不是一个String,而是一个对象Address,如下所示

public class Person
 {
 /// <summary>
 /// 姓名
 /// </summary>
 public string Name { get; set; }
 /// <summary>
 /// 年龄
 /// </summary>
 public int Age { get; set; }
 /// <summary>
 /// 性别
 /// </summary>
 public bool Sex { get; set; }

 /// <summary>
 /// 地址
 /// </summary>
 public Address Address { get; set; }
 }
public class Address
 {
 /// <summary>
 /// 家庭地址
 /// </summary>
 public string Home { get; set; }

 /// <summary>
 /// 家庭电话
 /// </summary>
 public string Phone { get; set; }
 }

假如Address也有一个验证器

public class AddressValidator : AbstractValidator<Address>
 {
 public AddressValidator()
 {
 this.RuleFor(m => m.Home)
 .NotEmpty()
 .WithMessage("家庭住址不能为空");

 this.RuleFor(m => m.Phone)
 .Length(11, 12)
 .WithMessage("电话必须是11-12位之间");
 }
 }

现在需求变了,在Person实体的要求里不仅要求Name、Age不能为空,并且还要求Address下的Home和Phone满足AddressValidator的要求,这可怎么办呢?

当然你可以像这样做

public class PersonValidator : AbstractValidator<Person>
 {
 public PersonValidator()
 {
 this.RuleFor(p => p.Name)
 .NotEmpty()
 .WithMessage("名字不能为空");
 this.RuleFor(p => p.Age)
 .NotEmpty()
 .WithMessage("年龄不能为空!!");

 this.RuleFor(p => p.Address.Home)
 .MinimumLength(5)
 .WithMessage("家庭住址最短长度为5");

 }
 }

通过Person.Address去给每一个属性配置校验,这并不是不能完成,但如果Address属性比较比较多,在配置起来的时候重复工作量大大提高,并且人家AddressValidator已经完成配置了,你再来配置一遍,可以算是在浪费生命吗?

幸好,FluentValidation提供了一种为属性设置验证器的机制。

public class PersonValidator : AbstractValidator<Person>
 {
 public PersonValidator()
 {
 this.RuleFor(p => p.Name)
 .NotEmpty()
 .WithMessage("名字不能为空");
 this.RuleFor(p => p.Age)
 .NotEmpty()
 .WithMessage("年龄不能为空!!");

 this.RuleFor(p => p.Address)
 .NotNull()
 .WithMessage("地址不能为空")
 .SetValidator(new AddressValidator());

 }
 }

通过这样我们就将Address下的Home和Phome的验证追加到Person的Address属性上去了。

初步认识和使用就先到这儿了。感谢各位看官。后续会持续更新,直到搭建完系统架构。

总结

下载本文
显示全文
专题