Fluent Validation 大于或等于日期

Mar*_*rry 5 c# fluentvalidation asp.net-core

嗨,我允许客户制作要显示的事件,这些日期有ToDateFromDate,我需要检查ToDate是在未来还是与FromDate;相同。我使用了这个流畅的验证。

    public class EventDateValidator : AbstractValidator<Event>
{
    public EventDateValidator()
    {
        RuleFor(evd => evd.FromDate)
         .NotEmpty().WithMessage("*Required");

        RuleFor(evd => evd.ToDate)
        .NotEmpty().WithMessage("*Required")
        .GreaterThanOrEqualTo(r => r.FromDate)
        .WithMessage("Date To must be after Date From");
    }
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是当创建表单加载时会抛出一个空引用错误:

处理请求时发生未处理的异常。NullReferenceException:未将对象引用设置为对象的实例。FluentValidation.AspNetCore.MinLengthClientValidator.AddValidation(ClientModelValidationContext context) in MinLengthClientValidator.cs,第 22 行

GreaterThan 工作得很好,但是如果它的一天事件验证失败。

这是我第一次使用fluent,所以我的知识非常有限。我实际上是用这个问题来让我开始的。

MVC5 比较两个可为空的日期与流畅的验证

Edg*_*oks 0

请更新您的原始问题和MinLengthClientValidator.cs来源Event.cs,可能存在问题 - 我将据此编辑最终答案。请参阅下面的实现,可以很好地配合您的输入。

using FluentValidation;
using FluentValidation.Results;
using Shouldly;

namespace StackOverflowQandA
{
    public class FluentValidationTests
    {
        private readonly EventDateValidator validator = new EventDateValidator();

        [Fact]
        public void ToGreaterThanFrom()
        {
            ValidationResult result = validator.Validate(new Event
            {
                FromDate = new DateTime(2023, 1, 1),
                ToDate = new DateTime(2023, 1, 15)
            });

            result.IsValid.ShouldBeTrue();
        }

        [Fact]
        public void ToLessThanFrom()
        {
            ValidationResult result = validator.Validate(new Event
            {
                FromDate = new DateTime(2023, 1, 25),
                ToDate = new DateTime(2023, 1, 15)
            });

            result.IsValid.ShouldBeFalse();
        }

        [Fact]
        public void FromToSame()
        {
            ValidationResult result = validator.Validate(new Event
            {
                FromDate = new DateTime(2023, 1, 15),
                ToDate = new DateTime(2023, 1, 15)
            });

            result.IsValid.ShouldBeTrue();
        }

        [Fact]
        public void ToIsNull()
        {
            ValidationResult result = validator.Validate(new Event
            {
                FromDate = new DateTime(2023, 1, 15),
                ToDate = null
            });

            result.IsValid.ShouldBeFalse();
        }

        [Fact]
        public void FromIsNull()
        {
            ValidationResult result = validator.Validate(new Event
            {
                FromDate = null,
                ToDate = new DateTime(2023, 1, 15)
            });

            result.IsValid.ShouldBeFalse();
        }
    }

    public class Event
    {
        public DateTime? FromDate { get; set; }

        public DateTime? ToDate { get; set; }
    }

    public class EventDateValidator : AbstractValidator<Event>
    {
        public EventDateValidator()
        {
            RuleFor(evd => evd.FromDate)
                .NotEmpty().WithMessage("*Required");

            RuleFor(evd => evd.ToDate)
                .NotEmpty().WithMessage("*Required")
                .GreaterThanOrEqualTo(r => r.FromDate).WithMessage("Date To must be after Date From");

        }
    }
}
Run Code Online (Sandbox Code Playgroud)