ASP.NET MVC 2 Проверка вложенных объектов - PullRequest
2 голосов
/ 26 июля 2010

Согласно спецификации, сложные дочерние свойства (иначе говоря, «вложенные объекты») проверяются только в том случае, если для одного из свойств вложенного объекта найдены входные данные.

Например, если Person имеет свойства {string Name, Address HomeAddress} и Address имеют свойства {Street, City}, и действие принимает параметр типа Person, тогда Person.HomeAddress.Street и Person.HomeAddress.City проверяются только в том случае, если для формы ввода были введены редакторы для этих вложенных свойств.

Есть ли способ заставить MVC проверять вложенные объекты, даже если входные данные для их свойств не найдены?

Спасибо!

1 Ответ

3 голосов
/ 27 июля 2010

Я так не думаю, поскольку проверка выполняется с помощью следующего кода в DefaultModelBinder

protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) {
    Dictionary<string, bool> startedValid = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);

    foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(bindingContext.ModelMetadata, controllerContext).Validate(null)) {
        string subPropertyName = CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName);

        if (!startedValid.ContainsKey(subPropertyName)) {
            startedValid[subPropertyName] = bindingContext.ModelState.IsValidField(subPropertyName);
        }

        if (startedValid[subPropertyName]) {
            bindingContext.ModelState.AddModelError(subPropertyName, validationResult.Message);
        }
    }

Вы можете попробовать обмануть подшивку модели, используя скрытое поле формы для Person.Addressсвойство, подобное этому

<%= Html.HiddenFor(m => m.Address) %>

или

<%= Html.HiddenFor(m => m.Address.FirstLine) %> //just pick any property

И это может сбить механизм связывания модели для проверки.Хотя, если это работает, вы не сможете ввести значение, так как это скрытое поле формы, но я считаю, что это то, что вы хотите:)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...