我可以根据相关实体中的字段来验证一个字段吗?

问题描述 投票:0回答:1

我有一个项目。

public class Project
{
    public int Id { get; set; }
    public int? ParentProjectId { get; set; }
    public DateTime? Deadline { get; set; }

    public Project ParentProject { get; set; }
}

当我输入一个日期 Deadline 在一个子项目上,我想确保它不超过 Deadline 的父项目。

我在Startup.cs中这样注册验证器。

services.AddTransient<IValidator<Project>, ProjectValidator>();

我试了一下

RuleFor(x => x.Deadline)
    .LessThanOrEqualTo(x => x.ParentProject.Deadline)
    .WithMessage("The deadline cannot exceed the deadline of the parent project.");

但我得到的是

NullReferenceException。对象引用未被设置为一个对象的实例。

这是因为在验证时,父项目没有被加载。

如何才能让它工作?

更新

我做了这个变通方法。

在控制器的POST方法中

DateTime? parentProjectDeadline = await db.Projects
    .Where(p => p.Id == project.ParentProjectId)
    .Select(d => d.Deadline)
    .FirstOrDefaultAsync();
if (project.Deadline > parentProjectDeadline)
{
    ModelState.AddModelError("Deadline", "The deadline cannot exceed the deadline of the parent project.");
}
c# asp.net-core-mvc fluentvalidation
1个回答
1
投票

.当

你可以排除在验证时没有加载父项目的情况。

RuleFor(x => x.Deadline)
.When(x => x.ParentProject != null)
.LessThanOrEqualTo(x => x.ParentProject.Deadline)
.WithMessage("The deadline cannot exceed the deadline of the parent project.");

为什么没有加载?

你能解释一下ParentProject如何在 "验证时 "没有被加载吗?对它的getter的调用不是应该总是加载并返回它吗?_id 有价值吗?

© www.soinside.com 2019 - 2024. All rights reserved.