当我需要使用两个验证器验证模型时,我遇到了这种情况:
1)BaseValidator
有一些共同的规则。
2)[Variable]CustomValidator
根据模型的某个属性确定。
将向您展示我打算做什么的代码(当然,因为没有AlsoValidateWith()
这样的方法,它不起作用)如下:
[Validator(typeof(AnimalValidator))]
public class AnimalModel
{
public string Type { get; set }
public int NumberOfLegs { get; set; }
public string Color { get; set; }
public int NumberOfEyes { get; set; }
public bool HasWings { get; set; }
}
public class AnimalValidator: AbstractValidator<AnimalModel>
{
public AnimalValidator()
{
RuleFor(x => x.NumberOfEyes).Equal(2);
RuleFor(x => x).AlsoValidateWith(new DogValidator()).When(x => x.Type == "Dog");
RuleFor(x => x).AlsoValidateWith(new CatValidator()).When(x => x.Type == "Cat");
}
}
public class DogValidator: AbstractValidator<AnimalModel>
{
public DogValidator()
{
RuleFor(x => x.Color).Equal("Black");
RuleFor(x => x.NumberOfLegs).Equal(2);
RuleFor(x => x.HasWings).Equal(false);
}
}
感谢任何帮助!
答案 0 :(得分:0)
我不认为使用When方法是可行的,除非您正在验证“子”模型。
但是,调用代码(例如您的控制器)可以调用相应的验证器。这是一个简化的例子:
public ActionResult SomeAction(AnimalModel model)
{
ModelState.Clear();
if (model.Type == "Dog")
model.ValidateModel(new DogFullValidator(), ModelState);
else if (model.Type == "Cat")
model.ValidateModel(new CatFullValidator(), ModelState);
// etc.
}
上面的示例使用一个简单的扩展方法来调用流畅的验证:
public static class ValidationExtensions
{
public static ModelStateDictionary ValidateModel<TModel, TValidator>(this TModel model, TValidator validator, ModelStateDictionary modelState)
where TModel : class
where TValidator : AbstractValidator<TModel>
{
var result = validator.Validate(model);
result.AddToModelState(modelState, string.Empty);
return modelState;
}
}