FluentValidation 何时不引发任何消息

FluentValidation when does not raises any message

我对这段代码有疑问:

RuleFor(field => field.TermEndDate)
    .NotEmpty()
    .When(x => x.TermEndDate == x.TermStartDate)
    .WithMessage("error...");

我设置了 TermEndDate = DateTime.Now 但没有消息出现!

我的测试代码是:

var now = DateTime.Now;
var command = new AddTermCommand
{
    SchoolId = Guid.NewGuid(),
    TermStartDate = now,
    TermEndDate = now
};
var cmd = command.Validate();
if (!cmd.IsValid)
    Console.WriteLine(cmd.Errors.First().ErrorMessage);

您的规则永远不会触发,因为 TermEndDate 永远不会 等于 DateTime.Now;您正在将过去的值与 Now.

的移动值进行比较

尝试验证特定日期或仅验证日期:

RuleFor(field => field.TermEndDate)
.NotEmpty()
.When(x => x.TermEndDate.Date == DateTime.Today)
.WithMessage("error...");

您的代码有两个问题:

正如我在评论中指出的那样,第一个问题是您无法真正与 DateTime.Now 进行比较,因为在一段时间(甚至非常短)后调用 DateTime.Now 会给您一个不同的值。

第二个问题是您使用的是When方法。 When 方法用于首先指定一个条件 运行 验证(例如,您可以指定您想要验证此 属性 仅当某些其他值属性 为 1),不能用于指定验证规则。相反,您可以像这样使用 Must 方法:

RuleFor(field => field.TermEndDate)
    .NotEmpty()
    .Must(x => (DateTime.Now - x).Duration() > TimeSpan.FromMinutes(1))
    .WithMessage("error...");

这里我用Must表示TermEndDate的值应该至少比我的时间多或少1分钟(与DateTime.Now相差1分钟) 运行 验证(这是我调用 Validate 时)。

更新:

比较TermEndDateTermStartDate,你可以这样做:

RuleFor(field => field.TermEndDate)
    .Must((cmd, enddate) => enddate != cmd.TermStartDate)
    .WithMessage("error...");