我有一个简单的模型:
[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;
}
答案 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个验证程序类的基类来包含通用规则,以避免重复验证规则。