3

我有一个像这样的简单模型:

[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;
    }
4

2 回答 2

1

您可以使用谓词验证器(又名 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;
    })
于 2012-12-20T15:08:33.120 回答
0

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

于 2012-12-23T16:56:21.567 回答