C#开发中用于参数校验的常用的类库有两种,DataAnnotations和fluentvalidation

1、DataAnnotations:

  ① 类库:System.ComponentModel.Annotations

  ② 原生的组件上就提供了丰富的参数校验规则, 也支持自定义规则.

  • Required 必填, 示例:[Required(ErrorMessage = "ID是必填项")] 需要注意除了string类型的其他的值类型由于会赋予默认值, 所以加这个属性的时候值类型字段需要设置为可为空 例如 int? Id {get;set;}
  • DisplayName:显示名
  • Range 范围校验, 示例 [Range(1,99999999,ErrorMessage ="请输入正确的页码")]
  • Compare 比较 与指定的字段值进行比较  [Compare("MyOtherProperty")]两个属性必须相同值,比如我们要求用户重复输入两次邮件地址时有用
  • CreditCard 信用卡号
  • EmailAddress 是否为邮件
  • EnumDataType 校验枚举类型 示例:  [EnumDataType(typeof(EnumModels.ResponseHttpCode),ErrorMessage = "未知的类型")]
  • MaxLength 最大长度, 示例: [MaxLength(50,ErrorMessage = "昵称不能超过50个字")]
  • MinLength 最小长度 , 示例: [MinLength(2,ErrorMessage = "昵称不能少于2个字")]
  • StringLength 字符串长度不能超过给定的最大长度,也可以指定最小长度. 示例: [StringLength(50, ErrorMessage = "昵称只能介于2-50个字", MinimumLength = 2)]
  • Url url格式, 示例: [Url(ErrorMessage = "链接格式错误")]
  • RegularExpression 正则表达式 示例: [RegularExpression(@"^[1]{1}[3,4,5,6,7,8,9]{1}\d{9}$", ErrorMessage = "手机号码格式错误")]
  • Bind:绑定:列出将参数绑定到表单时包含和不包含的参数。
  • ScaffoIdColumn:隐藏的字符
  • DataType:在前端显示的文本框类型
  • Remote:服务端验证
  • [Editable(false)]:放在主键上显示不可修改

  ③ Validatetion帮助类-ValidatetionHelper

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:类成员的校验的工具类-System.ComponentModel.DataAnnotations                                                       
*│ 作    者:执笔小白整理-取自:                                             
*│ 版    本:1.0                                       
*│ 创建时间:2022-07-08 23:59:52                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: ZhibiXiaobai.Model                               
*│ 类    名:ValidatetionHelper                                     
*└──────────────────────────────────────────────────────────────┘
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace ZhibiXiaobai.Model
{
    /// <summary>
    /// 类成员的校验帮助类
    /// 使用System.ComponentModel.DataAnnotations验证字段数据正确性
    /// </summary>
    public class ValidatetionHelper
    {
        /// <summary>
        /// 校验类成员的值是否符合规定
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static ValidResult IsValid(object value)
        {
            ValidResult result = new ValidResult();
            try
            {
                ValidationContext validationContext = new ValidationContext(value, null, null);
                List<ValidationResult> results = new List<ValidationResult>();
                bool isValid = Validator.TryValidateObject(value, validationContext, results, true);

                if (!isValid)
                {
                    result.IsVaild = false;
                    result.ErrorMembers = new List<ValidatetionErrorInfo>();
                    foreach (ValidationResult item in results)
                    {
                        string ErrorElement_Name = item.MemberNames.FirstOrDefault();  // 可为空
                        result.ErrorMembers.Add(new ValidatetionErrorInfo()
                        {
                            ErrorElement_Name = String.IsNullOrEmpty(ErrorElement_Name) ? "未知元素" : ErrorElement_Name,
                            ErrorMessage = String.IsNullOrEmpty(item.ErrorMessage) ? "未知错误" : item.ErrorMessage
                        });
                    }
                }
                else
                {
                    result.IsVaild = true;
                }
            }
            catch (Exception ex)
            {
                result.IsVaild = false;
                result.ErrorMembers = new List<ValidatetionErrorInfo>();
                result.ErrorMembers.Add(new ValidatetionErrorInfo()
                {
                    ErrorMessage = ex.Message,
                    ErrorElement_Name = "内部类成员校验错误,代码:ValidatetionHelper-Error"
                });
            }

            return result;
        }

        /// <summary>
        /// 调用示例
        /// </summary>
        private void Test()
        {
            ValidatetionHelperTest person = new ValidatetionHelperTest();
            person.Name = "";
            person.Email = "121 212 K";
            person.Phone = "2345";
            person.Salary = 3000;
            var result = ValidatetionHelper.IsValid(person);
            if (!result.IsVaild)
            {
                foreach (ValidatetionErrorInfo errorMember in result.ErrorMembers)
                {
                    Console.WriteLine(errorMember.ErrorElement_Name + ":" + errorMember.ErrorMessage);
                }
            }
            Console.Read();
        }
    }

    /// <summary>
    /// 校验结果
    /// </summary>
    public class ValidResult
    {
        /// <summary>
        /// 报错的类成员
        /// </summary>
        public List<ValidatetionErrorInfo> ErrorMembers { get; set; } = new List<ValidatetionErrorInfo>();
        /// <summary>
        /// 类中的成员是否全部校验通过
        /// </summary>
        public bool IsVaild { get; set; } = false;
    }

    /// <summary>
    /// 类成员的报错信息类
    /// </summary>
    public class ValidatetionErrorInfo
    {
        /// <summary>
        /// 报错成员的名称
        /// </summary>
        public string ErrorElement_Name { get; set; } = String.Empty;

        /// <summary>
        /// 对应的报错信息
        /// </summary>
        public string ErrorMessage { get; set; } = String.Empty;
    }

    /// <summary>
    /// 测试的实体
    /// </summary>
    internal class ValidatetionHelperTest
    {
        [Required(ErrorMessage = "{0} 必须填写")]
        [DisplayName("姓名")]
        public string Name { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "邮件格式不正确")]
        public string Email { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [Range(1, 100, ErrorMessage = "超出范围")]
        public int Age { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [StringLength(11, MinimumLength = 11, ErrorMessage = "{0}输入长度不正确")]
        public string Phone { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [Range(typeof(decimal), "1000.00", "2000.99")]
        public decimal Salary { get; set; }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.

作者:꧁执笔小白꧂