我对此代码有疑问:
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);
答案 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
时)。
<强>更新强>
要将TermStartDate
与RuleFor(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...");