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