使用流畅的验证我遇到了问题,说实话,我不太了解最新情况。
我有一个由
组成的模型public class Model
{
public int A { get; set;}
public int B { get; set;}
public string C {get; set;}
}
public class ModelValidator : AbstractValidator<Model>
{
public ModelValidator()
{
RuleFor(model => model.A).InclusiveBetween(1,10).WithMessage("something");
RuleFor(model => model.B).NotEmpty().WithMessage("test message").InclusiveBetween(1,5).WithMessage("something2");
// Few other rules
}
}
问题是,如果我将表格空白留下将被绑定(提交后)到模型中的属性A或B所有我得到的是验证错误&#39;&#34; A&#34;一定不能空着#39;或者在B&#34;测试消息&#34;的情况下。尽管调试器中的值不正确(已检查ModelState),但我不会在模型中获取其他属性的任何错误和消息。如果A和B填充的值不正确但不是空白,则一切正常。我没有设置某种验证器标志或者其他东西因为坦率地说我不知道发生了什么因为在我给出属性B的.NotEmpty()验证器的实验后我发现自定义这个验证器毕竟是消息来源(如果必须是某种默认消息)。
动作代码(我认为无关紧要,因为ModelState是在模型绑定之后设置的(我已经在动作调用开始时检查了它)。
[HttpPost]
public ActionResult Create(Model model)
{
if (ModelState.IsValid)
{
Console.WriteLine("done") //Ok there is some BL call logic here but it does not affect Model/Request state
}
return View("");
}
编辑:我的猜测是,表单中的空白字符被发布为空字符串。在模型I中,我有一个不可为空的int - &gt;这不能轻易转换为int的正确值。我不明白的是为什么验证逻辑只能部分执行。我确信验证器实际上已被执行,因为使用带有自定义验证消息的验证器NotEmpty()实际上会更改该字段的消息。我不明白为什么看起来只有这一个验证器被执行。
我的第一个猜测是那些是ModelBinding错误,而不是验证错误。但是再一次Validator能够改变这个消息 - &gt;所以他毕竟执行了。但为什么除了这一个规则之外的所有其他验证者都会被忽略?
编辑:
好的,让我们做一些调整:
public class ModelValidator : AbstractValidator<Model>
{
public ModelValidator()
{
RuleFor(model => model.A).InclusiveBetween(1,10).WithMessage("something");
RuleFor(model => model.B).NotEmpty().WithMessage("test message").InclusiveBetween(1,5).WithMessage("something2");
RuleFor(model => model.C).Must(x => x.Length > 10).WithMessage("to short");
}
}
情景1:
形式:
结果:返回的消息/错误:
情景2:
表格
结果:返回的消息/错误:
//没有C的消息 - 只有那些2应该是C的消息