0

我有DateTime?属性类。一般来说,它们是一对(请求/接收)日期。我FluentValidation在我的项目中使用过。我可以编写将接收两个DateTime?参数的验证器吗?条件:

  1. 请求必须小于或等于接收
  2. Request 为空时无法设置接收

可能我将来会有更多的条件。

4

1 回答 1

2

您不能使用LessThanOrEqualTo扩展方法,因为它不适用于可为空的日期时间。

有一件事还不清楚,但我可能猜到:如果Receive为空,Request可以有任何值(甚至为空),对吧?

你可以做这样的事情(我使用了一个类 Item,与你的属性相同),一步管理你的两个规则:

public ItemValidator()
        {
            RuleFor(m => m.Request)
                .Must((x, y) => CheckRequestAndReceive(x));
        }

        private static bool CheckRequestAndReceive(Item item)
        {
            //Reveive can't be set when Request is null
            if (item.Request == null)
                return item.Receive == null;

            //Request can be anything if Receive is null
            if (item.Receive == null)
                return true;

            //Request must be less or equal to Receive   
            return item.Receive.Value >= item.Request.Value;
        }

测试:

var item = new Item
    {
       Receive = DateTime.Now
     };
var errors = new ItemValidator().Validate(item);// => ERROR

var item2 = new Item()
    {
       Request = DateTime.Now
    };
errors = new ItemValidator().Validate(item2); //=> OK

var dt = DateTime.Now;
var item3 = new Item
    {
       Receive = dt,
       Request = dt
    };
errors = new ItemValidator().Validate(item3); //=> OK

var item4 = new Item
    {
        Receive = DateTime.Now,
        Request = DateTime.Now.AddDays(1)
    };
errors = new ItemValidator().Validate(item4); //=> ERROR
于 2013-05-16T08:31:04.190 回答