0

如何验证选择列表的值为 0?

我试过以下

RuleFor(x => x.ProductId).Equal(0).WithMessage(required);
RuleFor(x => x.ProductId).NotEqual(0).WithMessage(required);
RuleFor(x => x.ProductId).GreaterThan(0).WithMessage(required);
RuleFor(x => x.ProductId).GreaterThan(0).When(x => x.ProductId < 1).WithMessage(required);
//etc.

我的选择列表的“选择...”值为“0”。如果我在表单中选择该值,则 ModelState.IsValid 会引发错误(“不是预期的范围”),或者如果我注释掉 ModelState.IsValid,则会将值 0 发布到数据库中。无论哪种方式都不会发生验证。我所有其他混合了字符串、int 和 boolean 的字段都可以正常工作并正确验证。

注意:ProductId 在我的模型和视图模型中是一个 int。

丢失..

4

1 回答 1

1

我解决了这个问题。这是一个我希望我从未问过的问题。解决方案是错误的喜剧,但我仍然会分享我在此过程中发现的内容。

简短的回答是:

RuleFor(x => x.ProductId).GreaterThan(0).WithMessage(required);

问题出在我的控制器和(够尴尬的)我的观点上。

  1. 我忘记为 ProductId 添加验证消息。但这并没有完全解决问题。
  2. 我的控制器看起来像这样。

[HttpPost]
public ActionResult Update(ProductModel model)
{
  if(!ModelState.IsValid)
      throw new ArgumentExpection();
//etc.
}

我最初是在测试我的模型以使用 Automapper,一旦我实施了验证,我就忘记了删除 ArgumentException。

这样做从来没有让我的验证规则成为现实。当然,它从未验证过,因为控制器被告知抛出关于 ModelState 的错误,而不是回发 ACTUAL 验证错误。多哈!

[HttpPost]
public ActionResult Update(ProductModel model)
{
  if(!ModelState.IsValid)
     return View(model);//pssst! the validation error is in here.
//etc.
}

我现在对事物的顺序有了更好的理解。希望这可以帮助像我一样愚蠢的其他人。

于 2011-08-25T18:51:33.727 回答