【问题标题】:FluentValidation - validating across multiple propertiesFluentValidation - 跨多个属性进行验证
【发布时间】:2011-12-03 20:03:49
【问题描述】:

有一个表单,用户可以在其中输入活动的开始日期/时间和结束日期/时间。这是目前的验证器:

public class EventModelValidator : AbstractValidator<EventViewModel>
    {
        public EventModelValidator()
        {
            RuleFor(x => x.StartDate)
                .NotEmpty().WithMessage("Date is required!")
                .Must(BeAValidDate).WithMessage("Invalid date");
            RuleFor(x => x.StartTime)
                .NotEmpty().WithMessage("Start time is required!")
                .Must(BeAValidTime).WithMessage("Invalid Start time");
            RuleFor(x => x.EndTime)
                .NotEmpty().WithMessage("End time is required!")
                .Must(BeAValidTime).WithMessage("Invalid End time");
            RuleFor(x => x.Title).NotEmpty().WithMessage("A title is required!");
        }


        private bool BeAValidDate(string value)
        {
            DateTime date;
            return DateTime.TryParse(value, out date);
        }

        private bool BeAValidTime(string value)
        {
            DateTimeOffset offset;
            return DateTimeOffset.TryParse(value, out offset);
        }

    }

现在我还想添加 EndDateTime > StartDateTime(组合日期+时间属性)的验证,但不知道如何去做。

编辑: 为了澄清,我需要以某种方式结合 EndDate + EndTime/StartDate + StartTime 即 DateTime.Parse(src.StartDate + " " + src.StartTime) 然后验证 EndDateTime 与 StartDateTime - 我该怎么做?

【问题讨论】:

    标签: asp.net-mvc-3 fluentvalidation


    【解决方案1】:

    您可以尝试使用GreaterThan 规则:

    RuleFor(x => x.EndDate)
        .GreaterThan(x => x.StartDate)
        .WithMessage("end date must be after start date");
    

    【讨论】:

    【解决方案2】:

    在我重新阅读documentation 后终于让它工作了:“请注意,Must 还有一个额外的重载,它也接受正在验证的父对象的实例。”

    public class EventModelValidator : AbstractValidator<EventViewModel>
        {
            public EventModelValidator()
            {
                RuleFor(x => x.StartDate)
                    .NotEmpty().WithMessage("Date is required!")
                    .Must(BeAValidDate).WithMessage("Invalid date");
                RuleFor(x => x.StartTime)
                    .NotEmpty().WithMessage("Start time is required!")
                    .Must(BeAValidTime).WithMessage("Invalid Start time");
                RuleFor(x => x.EndTime)
                    .NotEmpty().WithMessage("End time is required!")
                    .Must(BeAValidTime).WithMessage("Invalid End time")
                    // new
                    .Must(BeGreaterThan).WithMessage("End time needs to be greater than start time");
                RuleFor(x => x.Title).NotEmpty().WithMessage("A title is required!");
            }
    
    
            private bool BeAValidDate(string value)
            {
                DateTime date;
                return DateTime.TryParse(value, out date);
            }
    
            private bool BeAValidTime(string value)
            {
                DateTimeOffset offset;
                return DateTimeOffset.TryParse(value, out offset);
            }
            // new
            private bool BeGreaterThan(EventViewModel instance, string endTime)
            {
                DateTime start = DateTime.Parse(instance.StartDate + " " + instance.StartTime);
                DateTime end = DateTime.Parse(instance.EndDate + " " + instance.EndTime);
                return (DateTime.Compare(start, end) <= 0);
            }
        }
    

    可能有一种更简洁/更优雅的方式来做到这一点,但目前,它可以正常工作。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多