首页 > 解决方案 > 集合项的 FluentValidator

问题描述

我正在开发一个 C# .NET Core API。使用FluentValidation验证DepartmentSelected集合,因为这是一个集合,我正在尝试使用RuleForEach

给定一个学生和系,我想确保每个学生的英语和数学都是必修课,并且必须包含在其他系中。但是,如果集合没有英语,则需要返回验证器消息“请选择英语”。如果集合没有数学,我们需要返回验证器消息“请选择数学”。

集合允许有其他部门。这是代码

请求 API

{   "StudentId" : 3,
    "StudentName":"BNeena", 
    "StudentType":"Hostler",    
    "DepartmentSelected":
    [
        {"StudentId" : 3, "DepartmentId" : 1,"DepartmentCode":Language},
        {"StudentId" : 3, "DepartmentId" : 5," DepartmentCode":Maths},
        {"StudentId" : 3, "DepartmentId" : 7," DepartmentCode":Mechanical},
        {"StudentId" : 3, "DepartmentId" : 23," DepartmentCode":Aeronautical},      
    ]
}

实体类

public class StudentDetails()
{ 
   public long StudentId { get; set; }
   public string StudentName { get; set; }
   public string StudentType { get; set; }
   public List<Department> SelectedDepartment{ get; set; }
}    

public class Department()
{      
   public long StudentId { get; set; }
   public string DepartmentId { get; set; }
   public string DepartmentCode{ get; set; }         
}

流利的验证器

 RuleForEach(t => t.SelectedDepartment)
    .SetValidator(new SelectedDepartmentValidator()); 

public SelectedDepartmentValidator()
{
           
    RuleFor(x => x.DepartmentID)
        .Must(x => !DeptList.Contains(x)) 
        .WithMessage("Please Select English");  
 }

我试过的代码不起作用

  1. .Must(x => x != DeptList.English)
  2. .Must(x => !DeptList.Contains(x))

我花了很多时间来弄清楚,但似乎没有任何帮助。我在这里面临的问题是 RuleForEach验证DepartmentSelected 集合中的所有项目,并在为其他部门(机械、航空。

接受的输出

仅当相应的(英语或数学)项目不在DepartmentSelected集合中时,验证器才需要返回“请选择英语”或“请选择数学”。

标签: c#apientity-frameworkfluentvalidation

解决方案


如果您想独立于其他元素单独检查每个元素,则需要 RuleForEach。例如名称的长度等。

在您的情况下,您需要将规则应用于整个集合。您走在正确的轨道上,您需要一个“.must”,仅在集合的上下文中。

例子:

在主验证器中,您需要以下规则之一:

  1. 如果不包含 DeptList 中的任何项目,则一条常见消息

        RuleFor(x => x.SelectedDepartment)
            .Must(selectedDepartment => DeptList.All(x => selectedDepartment.Contains(x)))
            .WithMessage("Common message.");
    
  2. 各部门留言

        RuleFor(x => x.SelectedDepartment)
            .Must(selectedDepartment => selectedDepartment.Contains(englishDepId))
            .WithMessage("Please select English.")
            .Must(selectedDepartment => selectedDepartment.Contains(mathsDepId))
            .WithMessage("Please select Maths.");
    

推荐阅读