代码之家  ›  专栏  ›  技术社区  ›  CodeMan

FluentValidation何时不引发任何消息

  •  5
  • CodeMan  · 技术社区  · 9 年前

    此代码有问题:

    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);
    
    2 回复  |  直到 9 年前
        1
  •  3
  •   Yacoub Massad    9 年前

    您的代码有两个问题:

    正如我在评论中所指出的,第一个问题是你无法真正与 DateTime.Now 自呼叫以来 日期时间。现在 一段时间后(甚至很小),你会得到一个不同的价值。

    第二个问题是您正在使用 When 方法这个 什么时候 方法首先用于指定运行验证的条件(例如,您可以指定仅当某个其他属性的值为1时才要验证该属性),但它不能用于指定验证规则。相反,您可以使用 Must 方法如下:

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

    我在这里使用 必须 可以说 TermEndDate 应至少多或少1分钟(距离 日期时间。现在 )而不是我运行验证的时间(即我调用 Validate ).

    更新:

    要进行比较 Term结束日期 具有 TermStartDate ,您可以这样做:

    RuleFor(field => field.TermEndDate)
        .Must((cmd, enddate) => enddate != cmd.TermStartDate)
        .WithMessage("error...");
    
        2
  •  2
  •   RePierre    9 年前

    你的规则永远不会失效,因为 TermEndDate 从不 等于 DateTime.Now ; 您正在将过去的值与移动值进行比较 Now .

    请尝试根据特定日期或仅根据日期进行验证:

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