C# 参数校验类库 学习笔记-目录

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)]:放在主键上显示不可修改

    原文见:https://www.bbsmax.com/A/KE5Q82bMJL/

  ③ Validatetion帮助类-ValidatetionHelper

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:类成员的校验的工具类-System.ComponentModel.DataAnnotations                                                       
*│ 作    者:执笔小白整理-取自:https://www.cnblogs.com/code1992/p/12091910.html                                             
*│ 版    本: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; }
    }
}

2、fluentvalidation:

  见:https://www.cnblogs.com/kelelipeng/p/14261760.html

补充-常用正则表达式

  见:https://blog.csdn.net/ZYC88888/article/details/98479629

posted @   ꧁执笔小白꧂  阅读(554)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示