流畅验证 大于或等于日期

12

您好,我允许客户创建事件以显示,这些日期具有 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");
    }
}

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

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

大于运算符运行得很好,但如果是一天事件,则验证失败。
这是我第一次使用流利,所以我的知识非常有限。实际上,我使用了这个问题来让我开始工作。 MVC5比较两个可空日期与流畅验证

你试过将 r.FromDate 强制设置为非空吗,像这样:(r => r.FromDate ?? DateTime.MinValue)? - undefined
不,我甚至都不知道如何在流利验证中实现那个。 - undefined
我尝试在模型中添加了DateTime.Now和DateTime.MinValue的默认值,但是没有成功。问题发生在表单加载之前,而不是在验证时,如果这有关系的话。 - undefined
我将FromDate设置为可空,并且按照你的建议使用了.GreaterThanOrEqualTo(r => r.FromDate ?? DateTime.MinValue),但仍然没有成功。 - undefined
你要验证的对象是 Event 还是 EventDate - undefined
事件是模型名称,我正在验证ToDate确保它大于FromDate。我已经在控制器中进行了验证。 - undefined
1个回答

0
请在原问题中更新您的问题,包括MinLengthClientValidator.csEvent.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");

        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接