【发布时间】:2013-05-16 07:59:59
【问题描述】:
我有 DateTime? 属性的课程。一般来说,它们是一对(请求/接收)日期。我在我的项目中使用了FluentValidation。我可以编写将接收两个DateTime? 参数的验证器吗?
条件:
- 请求必须小于或等于接收
- Request 为 null 时无法设置接收
以后可能会有更多条件。
【问题讨论】:
标签: asp.net-mvc-3 validation fluentvalidation
我有 DateTime? 属性的课程。一般来说,它们是一对(请求/接收)日期。我在我的项目中使用了FluentValidation。我可以编写将接收两个DateTime? 参数的验证器吗?
条件:
以后可能会有更多条件。
【问题讨论】:
标签: asp.net-mvc-3 validation fluentvalidation
您不能使用 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
【讨论】: