0

異なるコンテキストでビューモデルのバリデーションを行う必要があるシナリオがあります。たとえば、メッセージを投稿する場合は、特定のフィールドが必要ですが、ドラフトを保存するだけの場合は必要ありません。しかし、依然としてドラフトの必須フィールドがあります。したがって、保存しているシナリオに基づいて検証が必要な入力があります。IValidatableObjectを使用したMVCの条件付きバリデーション

私はIValidatableObjectを静的な属性がこれを許可していないと思われるので、柔軟な入力モデルで使用しています。 ValidationContext.Itemsプロパティを使用して、Validateメソッドにデータを渡すオプションがあることがわかります。私は検証でそれを読むことができますが、MVCのソースコードを検索した後、検証するシナリオを設定するためにTryUpdateなどを行う前に実際に設定する方法がないように見えます。

何か不足していますか、私は見ていない別の方法がありますか? IValidatableObjectを実装して、モデル/クラスで

public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext validationContext) 
{ 
    ValidationLevel validationLevel; 
    object validationLevelObject; 
    if (validationContext.Items.TryGetValue("$" + nameof(ValidationLevel), out validationLevelObject)) 
    { 
    validationLevel = (ValidationLevel)validationLevelObject; 
    } 
    else 
    { 
    validationLevel = ValidationLevel.Full; 
    } 
... 

答えて

0

、このような何かやってみてください:

... 

    public List<ValidationResult> ValidationResults { get; } = new List<ValidationResult>(); 

    public bool TryValidate(out List<ValidationResult> vResults) 
    { 
     vResults = ValidationResults; 

     var context = new ValidationContext(this); 
     Validate(context); 

     var fieldValidations = new List<ValidationResult>(); 
     var isValid = Validator.TryValidateObject(context.ObjectInstance, context, fieldValidations, 
      validateAllProperties: true); 

     //Add any attribute validation errors to ValidationResults 
     if (!isValid) 
     { 
      foreach (var validationResult in fieldValidations) 
      { 
       ValidationResults.Add(validationResult); 
      } 
     } 

     //Add your custom validations 
     if (!IsDraft() && Message.IsStringBlank()) 
     { 
      ValidationResults.Add(new ValidationResult("Message cannot empty"); 
     } 

     isValid = !ValidationResults.Any(); 
     return isValid; 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (_isClassValidate) return new List<ValidationResult>(); 

     _isClassValidate = true; 

     return ValidationResults; 
    }