0

我有一個場景,我需要在不同的上下文中以不同的方式驗證視圖模型。例如,如果您打算髮布消息,但是如果您只想保存草稿,則不需要某些字段。然而,草稿仍然有必要的字段。因此,我輸入的內容需要根據您保存的場景進行驗證。使用IValidatableObject MVC中的條件驗證

我在柔性輸入模型上使用IValidatableObject,因爲靜態屬性似乎不允許這樣做。我發現可以使用ValidationContext.Items屬性將數據傳遞給Validate方法。我可以在驗證中看到它,但是在通過MVC的源代碼搜索之後,看起來好像沒有辦法在您嘗試更新TryUpdate之前設置您正在驗證的場景。

我錯過了什麼,或者有沒有另一種方法,我沒有看到?

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

在你的模型/類實現的IValidatableObject,嘗試做這樣的事情:

... 

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