2012-07-23 3 views
0

위해 나는이 경우가 있습니다.두 검사기 한 모델

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

"자식"모델의 유효성을 검사하지 않는 한 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. 
} 

위의 예는 유창한 유효성 검사를 호출하는 간단한 확장 메서드를 사용하여 result`는`AddToModelState` 방법이없는`훌륭하지만

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; 
    } 
} 
+0

. 네가 쓴 또 다른 확장 프로그램인가? 이 경우 코드를 볼 수 있습니까? – Dmitry

+0

'FluentValidation.Mvc'에 정의되어 있으므로 사용 문이 필요합니다 – MarkG

+0

공유 솔루션을 이용해 주셔서 감사합니다. – Dmitry