2011-08-25 54 views
0

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

我曾尝试以下

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会抛出一个错误('not expected range'),或者如果我注释掉ModelState.IsValid,则会将值0发布到db。无论哪种方式没有验证发生。我的所有其他字段是字符串,int和布尔值的混合,可以正常工作并正确验证。

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

丢失..

回答

1

我解决了这个问题。这是我从未问过的问题。解决方案是一个喜剧的错误,但我仍然会分享我沿途发现的东西。

简短的回答是:

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

的问题是在我的控制器和(尴尬足够了)我的看法。

  1. 我忘了为ProductId添加我的validationmessage。但是这并没有完全解决问题。
  2. 我的控制器看起来像这样。

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

我本来是在试探我的模型与Automapper工作,一旦我实现验证我忘了取出的ArgumentException。

这样做是从来没有给我的验证规则的一天。当然,它从来没有验证,因为控制器被告知关于ModelState抛出一个错误,而不是回发ACTUAL验证错误。 Dohhh!

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

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