FluentValidation何时不引发任何消息

时间:2015-12-31 12:05:53

标签: c# fluent fluentvalidation

我对此代码有疑问:

RuleFor(field => field.TermEndDate)
    .NotEmpty()
    .When(x => x.TermEndDate == x.TermStartDate)
    .WithMessage("error...");

我设置TermEndDate = DateTime.Now但没有消息加注!

我的测试代码是:

var now = DateTime.Now;
var command = new AddTermCommand
{
    SchoolId = Guid.NewGuid(),
    TermStartDate = now,
    TermEndDate = now
};
var cmd = command.Validate();
if (!cmd.IsValid)
    Console.WriteLine(cmd.Errors.First().ErrorMessage);

2 个答案:

答案 0 :(得分:3)

您的代码存在两个问题:

正如我在评论中指出的那样,第一个问题是您无法与DateTime.Now进行真正比较,因为在一段时间后(即使非常小)调用DateTime.Now会给您一个不同的值。

第二个问题是您使用的是When方法。 When方法用于指定首先运行验证的条件(例如,您可以指定只有在某个其他属性的值为1时才要验证此属性),它不能是用于指定验证规则。相反,您可以使用Must方法,如下所示:

RuleFor(field => field.TermEndDate)
    .NotEmpty()
    .Must(x => (DateTime.Now - x).Duration() > TimeSpan.FromMinutes(1))
    .WithMessage("error...");

我在Must使用TermEndDate表示DateTime.Now的值应该比我运行时{1}}更多或更少(离Validate 1分钟)至少1分钟验证(当我调用TermEndDate时)。

<强>更新

要将TermStartDateRuleFor(field => field.TermEndDate) .Must((cmd, enddate) => enddate != cmd.TermStartDate) .WithMessage("error..."); 进行比较,您可以这样做:

using (StreamReader reader = new StreamReader(response.Stream))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        resultsList.Add(line);
    }
}

var list= new List<string[]>();
foreach (var row in resultsList)
{
    var temp = row.Split(new string[] { "\t" }, StringSplitOptions.None);
    list.Add(temp);
}

答案 1 :(得分:2)

您的规则永远不会触发,因为TermEndDate 永远不会等于DateTime.Now;您将过去的值与移动值Now进行比较。

尝试针对特定日期或仅针对当天进行验证:

RuleFor(field => field.TermEndDate)
.NotEmpty()
.When(x => x.TermEndDate.Date == DateTime.Today)
.WithMessage("error...");