首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不引发任何消息时的FluentValidation

不引发任何消息时的FluentValidation
EN

Stack Overflow用户
提问于 2015-12-31 12:05:52
回答 2查看 501关注 0票数 5

我对这个代码有一个问题:

代码语言:javascript
运行
复制
RuleFor(field => field.TermEndDate)
    .NotEmpty()
    .When(x => x.TermEndDate == x.TermStartDate)
    .WithMessage("error...");

我设置了TermEndDate = DateTime.Now,但没有消息引发!

我的测试代码是:

代码语言:javascript
运行
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-31 12:32:22

您的代码有两个问题:

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

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

代码语言:javascript
运行
复制
RuleFor(field => field.TermEndDate)
    .NotEmpty()
    .Must(x => (DateTime.Now - x).Duration() > TimeSpan.FromMinutes(1))
    .WithMessage("error...");

在这里,我使用Must来表示,TermEndDate的值应该比运行验证(即调用Validate时)至少多或少1分钟(距DateTime.Now1分钟)。

更新:

要将TermEndDateTermStartDate进行比较,可以这样做:

代码语言:javascript
运行
复制
RuleFor(field => field.TermEndDate)
    .Must((cmd, enddate) => enddate != cmd.TermStartDate)
    .WithMessage("error...");
票数 3
EN

Stack Overflow用户

发布于 2015-12-31 12:14:03

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

要么试着根据某一特定日期进行验证,要么仅仅针对某一天:

代码语言:javascript
运行
复制
RuleFor(field => field.TermEndDate)
.NotEmpty()
.When(x => x.TermEndDate.Date == DateTime.Today)
.WithMessage("error...");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34546304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档