如何为ViewModel中批量相似属性应用Fluent Validation?
使用Fluent Validation批量验证MovieNamesModel
1. 安装依赖
首先安装Fluent Validation的NuGet包:
Install-Package FluentValidation # 或使用.NET CLI dotnet add package FluentValidation
2. 定义ViewModel(示例)
public class MovieNamesModel { // 15个可空字符串属性 public string? MovieName1 { get; set; } public string? MovieName2 { get; set; } // ... 省略MovieName3至MovieName14 public string? MovieName15 { get; set; } // 10个DateTime属性 public DateTime MovieDate1 { get; set; } public DateTime MovieDate2 { get; set; } // ... 省略MovieDate3至MovieDate9 public DateTime MovieDate10 { get; set; } }
3. 创建批量验证器
通过反射遍历命名规则的属性,批量添加验证逻辑,复用错误消息模板:
using FluentValidation; using System.Reflection; public class MovieNamesModelValidator : AbstractValidator<MovieNamesModel> { public MovieNamesModelValidator() { // 批量验证MovieName1至MovieName15 for (int i = 1; i <= 15; i++) { var propertyName = $"MovieName{i}"; var property = typeof(MovieNamesModel).GetProperty(propertyName); RuleFor(x => property.GetValue(x)) .NotNull().WithMessage($"电影名称{i}不能为空") .NotEmpty().WithMessage($"电影名称{i}不能为空白") .MaximumLength(50).WithMessage($"电影名称{i}长度不能超过50个字符"); } // 批量验证MovieDate1至MovieDate10(含日期范围) var startDate = new DateTime(2020, 1, 1); var endDate = DateTime.Now.AddYears(1); for (int i = 1; i <= 10; i++) { var propertyName = $"MovieDate{i}"; var property = typeof(MovieNamesModel).GetProperty(propertyName); RuleFor(x => (DateTime)property.GetValue(x)) .GreaterThanOrEqualTo(startDate).WithMessage($"电影日期{i}不能早于{startDate:yyyy-MM-dd}") .LessThanOrEqualTo(endDate).WithMessage($"电影日期{i}不能晚于{endDate:yyyy-MM-dd}"); } } }
4. 使用验证器
在业务逻辑中调用验证:
var model = new MovieNamesModel(); var validator = new MovieNamesModelValidator(); var validationResult = validator.Validate(model); if (!validationResult.IsValid) { foreach (var error in validationResult.Errors) { Console.WriteLine(error.ErrorMessage); } }
说明
- 通过反射+循环批量处理命名规则的属性,避免重复编写15次MovieName和10次MovieDate的验证逻辑
- 错误消息模板中直接使用循环变量
i,自动填充属性编号,无需为每个属性单独写消息 - 日期范围验证只需定义一次起始/结束日期,批量应用到所有MovieDate属性,逻辑集中且易维护
内容的提问来源于stack exchange,提问作者Agnib
相关产品推荐
相关产品推荐

