У меня есть то, что я думаю, это несколько нормальная ситуация, когда мне нужно привязать сообщения формы к модели «порядок». Эта модель имеет несколько уровней информации к нему:DefaultModelBinder Проблема с вложенными уровнями + другие связующие
Order.Billing.FirstName
Order.Billing.Address.City
Order.Billing.Address.Country
Использование DefaultModelBinder, если я отправляю форму в действии, которое принимает эту модель Order как парам, следующие поля JustWork (TM):
<%=Html.TextBox("Billing.FirstName")%>
<%=Html.TextBox("Billing.Address.City")%>
Это поле не:
<%=Html.TextBox("Billing.Address.Country")%>
морщинка у меня есть с собственностью страны. В нашем случае Address.Country возвращает экземпляр класса Country (ISO2/3/логика имени/кода). Это не строка. Не удивительно, что он не работает по умолчанию.
Моей первой мыслью было создать CountryModelBinder (inherit DefaultModelBinder) и ModelBinders.Binders.Добавить его в тип страны. Когда я это делаю, CountryModelBinder никогда не будет вызван в scenerio выше.
Моей второй мыслью было создать AddressModelBinder (inherit DefaultModelBinder) и привязать его к нашему типу адреса. Хотя вызов вызван, вызов SetProperty для «Страны» имеет пустое значение, хотя в форме вывешено поле «Billing.Address.Country».
После некоторого вмешательства, похоже, что поведение привязки модели вызывает только CreateModel, когда модель является классом верхнего уровня, которое требуется действию, а все другие связующие имеют свой BindPropery/SetProperty, который называется дочерними свойствами.
Другими словами, если я создаю привязку к модели для Order, OrderAddress (Billing), Address и Country. Для действия, которое принимает порядок, вызывается только OrderModelBinder.CreateModel. ORDERAddress и Address.BindProperty/SetProperty вызываются для некоторых вещей, и иногда аргумент значения SetProperty пуст, если он явно размещен в имени, которое соответствует другим сопоставлениям свойств поля.
Достаточно просто добавить код в OrderModelBinder, чтобы вытащить Billing.Address.Country из Request.Form. Но у меня есть несколько моделей, которые используют Address, и все они выглядят сломанными.
Что мне здесь не хватает? Есть ли способ заставить CountryModelBinder фактически получить вызов в этом случае? Я думаю, что CountryModelBinder следует вызвать, когда Billing.Address.Country сопоставляется с свойством Country связующего адреса.
это может вам помочь: http://stackoverflow.com/questions/2462506/model-binding-with-nested-child-models-and-partialviews-in-asp-net-mvc – Will
У меня такая же проблема с вложенной структурой модели, мне кажется, что свойства на верхнем уровне и один уровень вниз становятся связанными, но все, что ниже, похоже, просто игнорируется. Это нормальное поведение модельного связующего? Кажется довольно произвольным поведением. – UpTheCreek