zoukankan      html  css  js  c++  java
  • ASP.NET全栈开发验证模块之服务端验证基础

    在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属性上去了。

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

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/Gxqsd/p/9326918.html
Copyright © 2011-2022 走看看