【问题标题】:Conditional Validation in MVC using IValidatableObject使用 IValidatableObject 在 MVC 中进行条件验证
【发布时间】:2016-11-18 21:00:52
【问题描述】:

我有一个场景,我需要在不同的上下文中以不同的方式验证视图模型。例如,如果您要发布消息,则某些字段是必需的,但如果您只想保存草稿,则不需要这些字段。然而,草稿仍有必填字段。因此,我有需要根据您保存的场景进行验证的输入。

我在灵活的输入模型上使用 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;
  }
...

【问题讨论】:

    标签: asp.net-mvc validation asp.net-core-mvc data-annotations


    【解决方案1】:

    在实现 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多