C# (.NET) 中的数据验证:库与方法

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

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

开始课程

C# (.NET) 中的数据验证:带示例的完整指南



数据验证是在 .NET 生态系统中使用 C# 开发可靠应用程序的关键方面之一。它确保传入数据符合既定规则,从而防止错误、漏洞和系统状态异常。在本文中,我们将详细解析 .NET 中用于验证的主要库和工具,包括内置机制和流行的第三方解决方案。



为什么数据验证很重要?

没有验证,应用程序可能会收到:

  • 不正确的数据类型(例如,字符串而不是数字)。
  • 超出允许范围的值(负年龄、不存在的电子邮件)。
  • SQL 注入、XSS 攻击和其他安全威胁。
  • 业务逻辑违规(没有商品的订单、空用户名)。

使用结构化的验证方法可以使代码更清晰、更易于测试且更安全。



1. 内置验证:Data Annotations (System.ComponentModel.DataAnnotations)

最简单且最常用的方法是使用 System.ComponentModel.DataAnnotations 命名空间中的属性。此方法非常适合 ASP.NET Core MVC、Web API 和 Entity Framework 中的模型。



带属性的模型示例:

using System.ComponentModel.DataAnnotations;

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

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

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

[Phone(ErrorMessage = "电话号码格式不正确")] public string Phone { get; set; }}


编程方式验证模型:

var user = new User { Name = "A", Email = "invalid", Age = 200 };var context = new ValidationContext(user);var results = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(user, context, results, true);

if (!isValid){ foreach (var error in results) { Console.WriteLine(error.ErrorMessage); }}


优点:简单、ASP.NET Core 内置支持、控制器级别自动验证。

缺点:灵活性有限,属性与模型紧密耦合,难以实现复杂的业务规则。



2. FluentValidation — 灵活且富有表现力的验证

FluentValidation 库是 .NET 中最流行的第三方验证工具。它允许将验证规则提取到单独的类中,支持方法链、自定义消息和复杂条件。



通过 NuGet 安装: Install-Package FluentValidation



验证器示例:

using FluentValidation;

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

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

RuleFor(u => u.Age) .InclusiveBetween(1, 120).WithMessage("年龄超出范围");

// 自定义规则 RuleFor(u => u.Phone) .Matches(@"^\\+?[1-9]\\d{1,14}$").When(u => !string.IsNullOrEmpty(u.Phone)) .WithMessage("电话号码需为国际格式"); }}


使用

推荐