使用IValidatableObject

时间:2016-11-18 21:00:53

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

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

我在柔顺的输入模型上使用IValidatableObject,因为静态属性似乎不允许这样做。我看到可以使用ValidationContext.Items属性将数据传递给Validate方法。我可以在验证中看到它,但是在搜索了MVC的源代码之后,看起来并没有像你在做TryUpdate之前实际设置那样的方法来设置你的方案吗? #39;重新验证。

我是否遗漏了某些东西,或者是否有其他方法我没有看到?

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

1 个答案:

答案 0 :(得分: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;
    }