C# (.NET) 数据验证:库、属性和 FluentValidation

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) 数据验证:完整指南

数据验证是使用 C# 开发可靠且安全应用程序的关键方面之一。它确保输入数据符合预期的格式、值范围和业务规则。在 .NET 生态系统中,有几种强大的验证工具:从内置的 System.ComponentModel.DataAnnotations 属性到灵活的 FluentValidation 库。在本文中,我们将通过代码示例详细分析这两种方法。



1. 通过 DataAnnotations 进行内置验证

System.ComponentModel.DataAnnotations 命名空间提供了一组可应用于模型类属性的属性。这是最简单的验证方法,尤其在 ASP.NET Core MVC 和 Blazor 中。



主要属性:

  • [Required] — 值不能为 null 或为空。
  • [StringLength(max)] — 字符串长度限制。
  • [Range(min, max)] — 数值范围检查。
  • [RegularExpression(pattern)] — 正则表达式检查。
  • [EmailAddress] — 电子邮件验证。
  • [Compare("OtherProperty")] — 两个属性的比较(例如,密码和确认密码)。


带有属性的模型示例:

public class UserRegistrationDto{    [Required(ErrorMessage = "姓名为必填项")]    [StringLength(50, MinimumLength = 2, ErrorMessage = "姓名长度应在 2 到 50 个字符之间")]    public string FirstName { get; set; }

[Required(ErrorMessage = "电子邮件为必填项")] [EmailAddress(ErrorMessage = "电子邮件格式不正确")] public string Email { get; set; }

[Required] [Range(18, 120, ErrorMessage = "年龄应在 18 到 120 之间")] public int Age { get; set; }

[Required] [DataType(DataType.Password)] public string Password { get; set; }

[Compare("Password", ErrorMessage = "密码不匹配")] public string ConfirmPassword { get; set; }}


手动模型验证:

public static bool ValidateUser(UserRegistrationDto user, out List<ValidationResult> errors){    var context = new ValidationContext(user);    errors = new List<ValidationResult>();    return Validator.TryValidateObject(user, context, errors, validateAllProperties: true);}

// 使用:var user = new UserRegistrationDto { FirstName = "A", Email = "invalid", Age = 15 };if (!ValidateUser(user, out var errors)){ foreach (var error in errors) Console.WriteLine(error.ErrorMessage);}


2. FluentValidation — 高级验证

FluentValidation 库(NuGet: FluentValidation.AspNetCore)通过流畅接口提供了一种更灵活、更易读的验证规则描述方式。它非常适合复杂场景:条件验证、自定义消息、规则链以及与 DI 容器的集成。



通过 NuGet 安装:

dotnet add package FluentValidation.AspNetCore


验证器示例:

using FluentValidation;

public class UserValidator : AbstractValidator<UserRegistrationDto>{ public UserValidator() { RuleFor(u => u.FirstName) .NotEmpty().WithMessage("姓名不能为空") .Length(2, 50).WithMessage("姓名长度应在 2 到 50 个字符之间");

RuleFor(u => u.Email) .NotEmpty().WithMessage("电子邮件为必填项") .EmailAddress().WithMessage("电子邮件格式不正确");

RuleFor(u => u.Age) .InclusiveBetween(18, 120).WithMessage("年龄应在

推荐