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("电话号码需为国际格式"); }}使用