导读:本期聚焦于小伙伴创作的《C#怎么实现FluentValidation验证 C#如何用FluentValidation编写链式风格的数据校验规则》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么实现FluentValidation验证 C#如何用FluentValidation编写链式风格的数据校验规则》有用,将其分享出去将是对创作者最好的鼓励。

在C#项目开发中,数据校验是几乎所有业务场景都需要处理的基础工作,传统的手动校验逻辑往往分散在业务代码中,可读性和可维护性较差。FluentValidation是一个基于.NET平台的验证框架,它支持通过链式调用的方式定义校验规则,让验证逻辑更集中、更清晰,同时提供了丰富的内置校验方法,能够满足大部分常见的数据校验需求。

C#怎么实现FluentValidation验证 C#如何用FluentValidation编写链式风格的数据校验规则

FluentValidation框架引入

首先需要在项目中安装FluentValidation的NuGet包,如果你使用的是.NET Core或者.NET 5及以上版本的项目,可以通过NuGet包管理器搜索FluentValidation进行安装,也可以通过命令行执行以下命令完成安装:

// 使用NuGet命令行安装FluentValidation
Install-Package FluentValidation

如果是ASP.NET Core项目,还可以安装FluentValidation.AspNetCore包,方便和框架的依赖注入、模型绑定功能集成,本文主要讲解基础使用方式,先以控制台项目为例演示。

定义待验证的实体类

首先需要定义需要校验的实体类,比如我们定义一个用户注册的实体类RegisterUser,包含用户名、密码、邮箱和年龄四个属性:

public class RegisterUser
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
}

编写链式风格的验证器

FluentValidation的核心是通过继承AbstractValidator<T>类来定义验证器,其中T是待验证的实体类型,在验证器中可以通过链式调用的方式定义各个属性的校验规则。

基础验证器定义

我们为RegisterUser创建一个对应的验证器RegisterUserValidator

using FluentValidation;

public class RegisterUserValidator : AbstractValidator<RegisterUser>
{
    public RegisterUserValidator()
    {
        // 用户名校验规则:非空,长度2-20位
        RuleFor(x => x.UserName)
            .NotEmpty().WithMessage("用户名不能为空")
            .Length(2, 20).WithMessage("用户名长度需要在2到20位之间");

        // 密码校验规则:非空,长度至少8位,包含数字和字母
        RuleFor(x => x.Password)
            .NotEmpty().WithMessage("密码不能为空")
            .MinimumLength(8).WithMessage("密码长度不能少于8位")
            .Matches(@"^(?=.*[A-Za-z])(?=.*d).+$").WithMessage("密码需要同时包含字母和数字");

        // 邮箱校验规则:非空,符合邮箱格式
        RuleFor(x => x.Email)
            .NotEmpty().WithMessage("邮箱不能为空")
            .EmailAddress().WithMessage("邮箱格式不正确");

        // 年龄校验规则:大于0,小于等于120
        RuleFor(x => x.Age)
            .GreaterThan(0).WithMessage("年龄需要大于0")
            .LessThanOrEqualTo(120).WithMessage("年龄不能超过120岁");
    }
}

上面的代码中,RuleFor方法用于指定要校验的属性,后续的NotEmptyLength等方法就是链式调用的校验规则,每个规则后面可以跟上WithMessage方法指定校验失败时的提示信息,这就是典型的链式风格校验规则写法。

复杂链式规则示例

FluentValidation还支持条件校验、自定义校验等更复杂的链式规则,比如我们需要校验当用户年龄小于18岁时,邮箱必须是家长邮箱:

public class RegisterUserValidator : AbstractValidator<RegisterUser>
{
    public RegisterUserValidator()
    {
        // 之前的规则省略...

        // 条件校验规则:如果年龄小于18,邮箱需要包含parent标识
        RuleFor(x => x.Email)
            .Must((user, email) => 
            {
                if (user.Age < 18)
                {
                    return email.Contains("parent");
                }
                return true;
            }).WithMessage("未成年人注册需要提供家长邮箱,邮箱需要包含parent标识")
            .When(x => x.Age < 18); // 只有当年龄小于18时才执行该规则
    }
}

执行校验操作

定义好验证器之后,就可以创建验证器实例,调用Validate方法对待验证对象执行校验,校验结果会包含是否通过、失败的校验信息等:

class Program
{
    static void Main(string[] args)
    {
        // 创建待验证的用户对象
        var user = new RegisterUser
        {
            UserName = "张",
            Password = "123",
            Email = "test@ippipp.com",
            Age = 15
        };

        // 创建验证器实例
        var validator = new RegisterUserValidator();
        // 执行校验
        var validationResult = validator.Validate(user);

        // 判断校验是否通过
        if (!validationResult.IsValid)
        {
            Console.WriteLine("数据校验失败,错误信息如下:");
            // 遍历所有校验失败的记录
            foreach (var error in validationResult.Errors)
            {
                Console.WriteLine($"属性:{error.PropertyName},错误:{error.ErrorMessage}");
            }
        }
        else
        {
            Console.WriteLine("数据校验通过");
        }
    }
}

上面的示例中,我们构造的user对象存在多处不符合校验规则的地方,执行后会输出所有校验失败的信息,开发者可以根据这些信息给用户对应的提示。

常用内置校验方法汇总

FluentValidation提供了很多常用的内置校验方法,以下是一些高频使用的方法说明:

方法名作用说明
NotEmpty()校验属性值不能为空,对于字符串会校验非空且非空白字符
NotNull()校验属性值不能为null,和NotEmpty的区别是不会校验空白字符串
Length(min, max)校验字符串长度在指定范围内
MinimumLength(length)校验字符串长度不小于指定值
EmailAddress()校验字符串符合邮箱格式
GreaterThan(value)校验数值大于指定值
LessThanOrEqualTo(value)校验数值小于等于指定值
Matches(regex)校验字符串符合指定的正则表达式
Must(predicate)自定义校验逻辑,传入一个返回bool的委托
When(condition)指定规则生效的条件

注意事项

  • 验证器类是线程安全的,建议在项目中通过依赖注入的方式单例使用,不需要每次校验都创建新实例。
  • 链式规则的顺序不影响校验结果,所有规则都会执行,除非使用了When等条件限制。
  • 如果需要校验集合类型的属性,可以使用RuleForEach方法,对集合中的每个元素应用校验规则。
  • 自定义错误信息时,可以使用占位符,比如{PropertyName}会自动替换为当前校验的属性名,{MinLength}会替换为对应规则的最小长度值等。

C#FluentValidation数据校验链式风格验证规则修改时间:2026-07-16 14:33:41

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。