You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:36:14