0

当我需要使用两个验证器验证模型时,我遇到了这种情况:

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);
    }
}

任何帮助表示赞赏!

4

1 回答 1

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;
    }
}
于 2012-12-20T11:06:05.200 回答