c# - 集合项的 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");
}
我试过的代码不起作用
.Must(x => x != DeptList.English)
.Must(x => !DeptList.Contains(x))
我花了很多时间来弄清楚,但似乎没有任何帮助。我在这里面临的问题是 RuleForEach验证DepartmentSelected 集合中的所有项目,并在为其他部门(机械、航空。
接受的输出
仅当相应的(英语或数学)项目不在DepartmentSelected集合中时,验证器才需要返回“请选择英语”或“请选择数学”。
解决方案
如果您想独立于其他元素单独检查每个元素,则需要 RuleForEach。例如名称的长度等。
在您的情况下,您需要将规则应用于整个集合。您走在正确的轨道上,您需要一个“.must”,仅在集合的上下文中。
例子:
在主验证器中,您需要以下规则之一:
如果不包含 DeptList 中的任何项目,则一条常见消息
RuleFor(x => x.SelectedDepartment) .Must(selectedDepartment => DeptList.All(x => selectedDepartment.Contains(x))) .WithMessage("Common message.");
各部门留言
RuleFor(x => x.SelectedDepartment) .Must(selectedDepartment => selectedDepartment.Contains(englishDepId)) .WithMessage("Please select English.") .Must(selectedDepartment => selectedDepartment.Contains(mathsDepId)) .WithMessage("Please select Maths.");
推荐阅读
- python - 这两个代码有什么区别?
- bash - 如何在 bash 中正确读取和写入同一管道
- php - 将浮点数转换为没有指数符号的字符串
- python - 为什么替换不替换?
- php - Firebird Interbase Connection - unset() 和 ibase_close()
- python - Ansible 2.8.6 迭代嵌套在字典中的列表
- hive - 如何使用 Sqoop 将日期时间列从 SQL Server 导入 Hive
- php - 如何显示我的数据库中的文件?404 错误
- c++ - 无法将 FFMPEG 动态链接到 VS 2019 项目
- r - 错误:尝试拆分 gtsummary 表时无法将元素 1 从双精度值强制转换为整数