使用FluentValidation根据类型更改验证

时间:2012-12-20 14:57:04

标签: asp.net-mvc asp.net-mvc-3 nopcommerce fluentvalidation

我有一个简单的模型:

[Validator(typeof(EntryModelValidator))]
public class EntryModel : BaseNopEntityModel
{
  public virtual string ProductActionValue { get; set; }
}

我正在使用FluentValidation来验证模型的保存。问题是,当用户在表单上保存值时,在某些情况下,ProductActionValue需要保存为int(当然它总是保存为字符串,但它需要作为int解析)。

我有以下验证规则,确保该值不为空:

 RuleFor(x => x.ProductCriteriaValue)
            .NotEmpty()
            .WithMessage(localizationService.GetResource("Common.FieldRequired"));

我尝试添加以下规则以验证为int:

 RuleFor(x => Int32.Parse(x.ProductCriteriaValue))
            .GreaterThanOrEqualTo(1)
            .When(x => (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedGreaterThanXDays || (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedLessThanXDays)
            .WithMessage(localizationService.GetResource("Common.FieldRequired"));

但这只会引发FluentValidation运行时错误。反正有没有实现这个目标?

提前致谢 人

更新反映AHMAD的解决方案:

   {
        RuleFor(x => x.ProductCriteriaValue)
            .Must(BeANumber)
            .WithMessage(localizationService.GetResource("Common.FieldRequired"));
   }

    private bool BeANumber(string value)
    {
        int result;
        if (Int32.TryParse(value, out result))
        {
            return result >= 1;
        }
        return false;
    }

2 个答案:

答案 0 :(得分:1)

您可以使用Predicate Validator (aka Must)

RuleFor(x => x.ProductCriteriaValue)
    .Must(x => Int32.Parse(x.ProductCriteriaValue) >= 1)
    .When(x => (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedGreaterThanXDays || (ProductCriteriaTypes)x.ProductCriteriaTypeId == ProductCriteriaTypes.ProductCreatedLessThanXDays)
    .WithMessage(localizationService.GetResource("Common.FieldRequired"));

当然,这假设解析不会失败。 ProductCriteriaValue总是一个数字并解析好吗?如果是这样,这没关系。否则,您可能希望使用Int32.TryParse并更改谓词,以便更好地检查这一点:

    .Must(x =>
    {
        int result;
        if (Int32.TryParse(x.ProductCriteriaValue, out result))
        {
            return result >= 1;
        }
        return false;
    })

答案 1 :(得分:0)

我在here上回答了一个类似的问题,该问题对同一个视图模型使用单独的验证器类。此外,请注意,您可以使用2个验证程序类的基类来包含通用规则,以避免重复验证规则。