ASP.Net MVC – модель с коллекцией, не заполняющей обратную передачу

У меня есть приложение ASP.Net MVC с моделью, которая содержит несколько слоев, содержащих коллекцию.

Я считаю, что представление о создании объектов настроено правильно, но оно просто не заполняет коллекцию в модели при отправке формы на сервер.

У меня есть часть данных, которая находится в иерархии classов, таким образом:

person.PersonDetails.ContactInformation[0].Data; 

Эта структура classов создается LinqToSQL, а ContactInformation имеет тип EntitySet . Чтобы создать представление, я передаю следующее:

 return View(person); 

и внутри представления у меня есть форма, которая содержит одно текстовое поле с именем, связанным с вышеупомянутым полем:

  

Метод post внутри моего controllerа следующий:

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create (Person person) { //Do stuff to validate and add to the database } 

Именно в этот момент я теряюсь как person.PersonDetails.ContactInformation.Count () == 0. Таким образом, ModelBinder создал объект ContactInformation, но не заполнил его объектом, который он должен удерживать (т.е. ContactData) с индексом 0.

Мой вопрос в два раза: 1. Я взял правильный подход … т.е. должен ли это работать? 2. Любые идеи относительно того, почему это может не заполнить объект ContactInformation?

Большое спасибо, Ричард

Я думаю, что ваша модель слишком сложна для стандартного связующего устройства. Вы можете попробовать использовать несколько параметров и привязать их к префиксам:

 public ActionResult Create( Person person, [Bind(Prefix="Person.PersonDetails")] PersonDetails details, [Bind(Prefix="Person.PersonDetails.ContactInformation")] ContactInformation[] info ) { person.PersonDetails = details; person.PersonDetails.ContactInformation = info; ... } 

Или вы могли бы разработать собственное собственное связующее устройство, которое бы понимало, как вывести сложную модель из входных данных формы.

Если свойство имеет значение NULL, то другое связующее модель не может найти его или не может найти значения в представленной форме, необходимые для создания экземпляра типа свойства. Например, если свойство имеет идентификатор с недействительными значениями, и ваша форма не содержит данных для этого идентификатора, связующее свойство модели оставит это свойство равным нулю, поскольку оно не может создать новый экземпляр типа без знания идентификатора.

Другими словами, чтобы диагностировать эту проблему, вы должны тщательно сравнить данные в представленной форме (это легко увидеть с помощью Firebug или Fiddler) со структурой объекта, который вы ожидаете, чтобы заполнить модель. Если отсутствуют какие-либо обязательные поля или если значения переданы таким образом, что они не могут быть преобразованы в тип требуемого поля, то весь объект останется нулевым.

Я боролся с этим сценарием того же типа и в конце концов понял, что основная проблема заключается в том, что связующее устройство модели MVC по умолчанию не работает в полях EntitySet , а только в List . Однако я нашел простую обходную схему, которая кажется приемлемой. В моем случае у меня есть компания, у которой есть одно отношение ко контактам (мой Linq-to-Sql EntitySet).

Поскольку кажется, что когда я меняю свой код с EntitySet на List , связующее устройство модели по умолчанию MVC начинает работать как ожидалось (даже если LTS не сейчас), я решил, что я предоставил альтернативу «aliased» “свойство MVC, которое имеет тип List , и, конечно же, это работает.

В classе моей компании:

 // This is what LINQ-to-SQL will use: private EntitySet _Contacts = new EntitySet(); [Association(Storage="_Contacts", OtherKey="CompanyID", ThisKey="ID")] public EntitySet Contacts { get { return _Contacts; } set { _Contacts.Assign(value); } } // This is what MVC default model binder (and my View) will use: public List MvcContacts { get { return _Contacts.ToList(); } set { _Contacts.AddRange(value); } } 

Итак, теперь в моем представлении у меня есть следующее:

 

Кажется, это работает как шарм!

Удачи! -Майк

Возможно, недостатком атрибута Bind является случай:

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create ([Bind] Person person) { // Do stuff to validate and add to the database } 

Первый аргумент Html.TextBox – это имя текстового поля, второе – значение.

“Неправильно”:

 <%= Html.TextBox("person.PersonDetails.ContactInformation[0].Data")%> 

“Правильно”:

 <%= Html.TextBox("nameoftextbox", person.PersonDetails.ContactInformation[0].Data)%> 

Убедитесь, что ваши модели (и все вложенные модели) используют свойства (getters / seters) вместо полей. По-видимому, связующее по умолчанию требует, чтобы свойства функционировали должным образом. У меня была очень похожая ситуация, которая была исправлена ​​путем изменения необходимых полей на свойства.

  • Обратный поиск карты
  • Глобальные исключения исключений в приложении WPF?
  • UnauthorizedAccessException не может разрешить сбой Directory.GetFiles
  • Как получить подстроку в C #?
  • C # WinForms отключает масштабирование DPI
  • Ошибка входа для пользователя «IIS APPPOOL \ ASP.NET v4.0»
  • В чем смысл запланированного модификатора доступа к закрытой защите?
  • Какие выражения дают ссылочный тип, когда к ним применяется метод decltype?
  • Разбор (разделение) строки в C ++ с использованием разделителя строк (стандартный C ++)
  • Затухание в / из GameObject
  • Доступ к переменной codebehind в XAML
  • Interesting Posts

    как игнорировать файлы в печи / ртути с использованием черепахи hg “, которые являются частью хранилища”

    Можно ли показывать индикатор выполнения при загрузке изображения через Retrofit 2

    Какой лучший метод RESTful возвращает общее количество элементов в объекте?

    Как включить список каталогов в Apache в Mac OS X

    Могут ли использоваться шаблоны lambda?

    SD-карта сжимается в допустимом размере после копирования образа диска

    Печать JFrame и его компонентов

    Написание сценариев оболочки, которые будут выполняться на любой оболочке (используя несколько строк shebang?)

    Как получить динамический массив размера c ++

    Есть ли средство командной строки Windows для копирования файлов на удаленные компьютеры?

    Каково время построения представления?

    Любая причина для очистки неиспользуемых импортов на Java, кроме сокращения беспорядка?

    Как я могу создать JSONP из веб-службы ASP.NET для междоменных вызовов?

    & operator необязательно в назначении указателя функции

    Notepad ++. Как заменить разные символы соответствующими буквами одновременно?

    Давайте будем гением компьютера.