Почему и как исправить проверку модели ASP MVC для дочерних объектов, но не для родительского объекта?

Я использую проверку IValidatableObject для сущностей, например. следующий код:

public class OuterObj : IValidatableObject
{    
    public int ID { get; set; }

    public string Name { get; set; }

    public IEnumberable<InnerObj> InnerObjList { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (this.ID <= 0)
        {
            yield return new ValidationResult("", new[] { nameof(this.ID) });
        }
    }
}

public class InnerObj : IValidatableObject
{
    public int ID { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (this.ID <= 0)
        {
            yield return new ValidationResult("", new[] { nameof(this.ID) });
        }
    }
}

В этом случае, когда я проверяю externalObj, когда присутствует innerObj, он проверяет только innerobj, а не externalobj. Он не достигает метода проверки внешнего объекта в случае наличия внутреннего объекта.

Я хотел бы проверить оба, когда присутствует innerobj. Пожалуйста, помогите мне с тем, как это делается. Почему он не проверяет внешний объект?


person NehaPatil    schedule 28.07.2016    source источник


Ответы (1)


МВК 5.2.3

Если родительский класс имеет свойства с атрибутами проверки, и любое из этих свойств было оценено как недопустимое, то IValidatableObject.Validate не будет вызываться в родительском классе.

Кажется, это своего рода сокращение, которое MVC выполняет для проверки модели.

В вашем примере не отображаются атрибуты проверки в родительском классе - я предполагаю, что они были исключены.

Обходной путь: удалить атрибуты проверки для свойств в родительском class и реализуйте проверку только в родительском классе через IValidatableObject интерфейс.

person Aaron Hudon    schedule 21.10.2016
comment
Если я использую только IValidatableObject как для родительского, так и для дочернего объекта (без каких-либо атрибутов) в MVC 5.2.3, поведение остается прежним. - person Stephan; 12.12.2019