当提交为空时,不会执行流畅的验证

时间:2016-09-19 12:34:35

标签: c# asp.net .net asp.net-mvc fluentvalidation

使用流畅的验证我遇到了问题,说实话,我不太了解最新情况。

我有一个由

组成的模型
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:

形式:

  • A = 11,
  • B = 6
  • C =&#34; text&#34;

结果:返回的消息/错误:

  • &#34;东西&#34;
  • &#34; something2&#34;
  • &#34;简短&#34;

情景2:

表格

  • A =&#34;&#34; //表格字段左侧空白
  • B =&#34;&#34; //表格字段左侧空白
  • C =&#34; text&#34;

结果:返回的消息/错误:

  • &#34;&#39; A&#39;必须不是空的&#34;
  • &#34;测试消息&#34;

//没有C的消息 - 只有那些2应该是C的消息

0 个答案:

没有答案