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

Как дополнение к Brendons ответьте:

Мы используем Подрывную деятельность начиная с версии 1.5.1 и использовали Subclipse сначала. Но потому что мы значительно зависим от объединяющейся функции, мы переключились на Подрывной, который более удобен и имеет отдельную опцию Reintegrate в объединяющемся диалоговом окне.

Одна ошибка, которая могла бы препятствовать при слиянии, - то, что при выборе изменений явно оно не берет последний перечисленный пересмотр. Например, "101-100" не объединяет r100, и "100" таким образом не объединяет ничего вообще. (версия 0.7.5)

И это имеет, использует те же индикаторы в качестве плагина CVS.

10
задан Community 23 May 2017 в 11:47
поделиться

4 ответа

Слепое предположение:

изменение:

<%= Html.TextBox("Complainants[" + i + "].Surname", complainant.Surname)%>

с:

<%= Html.TextBox("Complaint.Complainants[" + i + "].Surname",  
complainant.Surname)%>

Соответственно - добавить «Жалоба». перед "Заявители [..."

ИЗМЕНИТЬ :

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

EDIT2:

Я могу ошибаться, но мне кажется, что есть проблема со структурой сущностей (или - с тем, как вы ее используете). Я имею в виду - asp.net mvc удается читать значения из запроса, но не может инициализировать коллекцию жалобщиков.

Здесь написано:

Метод InitializeRelatedCollection (TTargetEntity) инициализирует существующую коллекцию EntityCollection (TEntity), которая была создана с использованием конструктора по умолчанию. EntityCollection (TEntity) инициализируется с использованием предоставленных отношений и имен целевой роли.

Метод InitializeRelatedCollection (TTargetEntity) используется только во время десериализации.

Дополнительная информация:

Exception:

  • InvalidOperationException

] Условия:

  • Когда предоставленная EntityCollection (TEntity) уже инициализирована.
  • Когда менеджер отношений уже присоединен к ObjectContext.
  • Когда менеджер отношений уже содержит отношение с этим именем и целевой ролью.

Почему-то InitializeRelatedCollection запускается дважды. К сожалению, я не понял, почему именно. Может быть, это небольшое расследование поможет кому-то другому - более опытному с EF. :)

РЕДАКТИРОВАТЬ3:
Это не решение этой конкретной проблемы, а скорее обходной путь, правильный способ обработки модельной части mvc.

Создавайте модель просмотра только для целей презентации. Создайте новую модель предметной области также из чистых POCO (потому что EF будет поддерживать их только в следующей версии). Используйте AutoMapper для сопоставления EFDataContext <=> Model <=> ViewModel.

Это потребует некоторых усилий, но так следует поступать. Этот подход снимает с модели ответственность за представление, очищает модель предметной области (удаляет элементы EF из модели) и решает вашу проблему с привязкой.

3
ответ дан 4 December 2019 в 01:57
поделиться

У меня была такая же проблема! В конце концов вы обнаружите, что фреймворк не может обрабатывать сложные модели.

Я написал небольшой компонент привязки, который может инициализировать сложные привязки в сообщении.

Но в основном то, что вам нужно сделать, - это то, о чем говорит Арнис Л.

0
ответ дан 4 December 2019 в 01:57
поделиться

Я обошел исключение ModelBinding, выполнив следующие действия:

// Remove the error from ModelState which will have the same name as the collection.
ModelState.Remove("Complaints"/*EntityCollection*/); 
if (ModelState.IsValid) // Still catches other errors.
{
    entities.SaveChanges(); // Your ObjectContext
}

Главный недостаток состоит в том, что исключение по-прежнему генерируется, и это может быть дорого во время выполнения. Изящный обходной путь может заключаться в создании оболочки вокруг существующего DefaultBinder и предотвращении повторного создания экземпляра EntityCollection, что уже сделано EF. Затем привяжите эту коллекцию к значениям формы (FormCollection).

Имейте в виду, что если вы привязываете более одной коллекции, вам нужно будет удалить ошибку для каждой коллекции.

В моем эксперименте коллекция успешно сохранена, а также корневой объект в графе, который эта коллекция был частью.

Надежды, которая помогает кому-то другому.

1
ответ дан 4 December 2019 в 01:57
поделиться
public ActionResult Edit([Bind(Exclude = "Complainants")]Complaint model)
{
  TryUpdateModel(model.Complainants, "Complainants");
  if (!ModelState.IsValid)
  {
      // return the pre populated model
      return View(model);
  }

}

Это работает для меня!

Я думаю, что, когда объект жалоба создается, то входит в коллекцию «Заявители» (из-за автоматической логики Entity Framework), а затем модельный связующий пытается создать саму по себе, что вызывает ошибку. Но когда мы пытаемся обновить модель вручную, коллекция уже инициализируется, но Binder Model не просим инициализировать его снова.

3
ответ дан 4 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: