Я еще не использовал EF, но у меня есть аналогичное требование на нашем сайте.Я выполнил это, указав представление как наследующее System.Web.Mvc.ViewPage<IEnumerable<MyModelObject>>
, а затем использовал цикл for для создания нескольких входных секций, используя соглашения об именах, необходимые для того, чтобы связыватель модели мог создать перечисляемое.
Я предпочитаю создавать представлениемодель со свойством, которое является перечислимым (см. обновление 2 ниже).В этом примере мы можем сказать, что это будет объект MyViewModel
со свойством IEnumerable<MyModelObject>
с именем MyModelObjects
.В этом случае представление будет воспроизводиться следующим образом ...
В частности, убедитесь, что для каждого входного раздела включено скрытое поле с именем MyModelObjects.Index
, а затем укажите входные данные вашего свойства с именем MyModelObjects[0].MyProperty
, гдезначение скрытого поля Index
соответствует индексу массива в именах свойств.
То, что вы в итоге получите, будет выглядеть так, например:
<div>
<input type="hidden" name="MyModelObjects.Index" value="0" />
Name: <input type="text" name="MyModelObjects[0].Name" /><br />
Value: <input type="text" name="MyModelObjects[0].Value" />
</div>
<div>
<input type="hidden" name="MyModelObjects.Index" value="1" />
Name: <input type="text" name="MyModelObjects[1].Name" /><br />
Value: <input type="text" name="MyModelObjects[1].Value" />
</div>
<div><a href="#" id="addItem">Add another item</a></div>
В некоторых случаяхУ меня также есть javascript (вызванный ссылкой привязки в разметке выше), который будет клонировать секцию ввода шаблона, изменить имена, чтобы заполнить значение индекса, и добавить его в DOM.Таким образом, пользователи могут динамически добавлять записи в представление.
В зависимости от того, как вы работаете с вашими моделями, вы также можете передать ViewModel со свойством IEnumerable.Типизирование для вида изменится, но принципиально дизайн представления не изменится.
ОБНОВЛЕНИЕ Используя приведенный выше пример, приведу краткий фрагмент кода jQuery, который я использую для добавления элементов.,Я предполагаю, что это вставка, но обратите внимание на комментарии, если вы хотите поддержать этот тип интерфейса для редактирования.
Сначала я настроил шаблон.Хотя это может быть полностью встроено в jQuery, я просто считаю, что проще делать разметку и манипулировать именами.
<div id="templateDiv" style="display: none;">
<input type="hidden" name="MyModelObjects.Index" value="0T" />
Name: <input type="text" name="MyModelObjects[0T].Name" /><br />
Value: <input type="text" name="MyModelObjects[0T].Value" />
</div>
Вы также можете указать там идентификаторы ... возможно, это хорошая практика, но вДля краткости я оставлю это для примера.
С этим вы можете настроить функцию jQuery следующим образом:
var currentIndex = 1 // if you were using this for editing, this would be dynamically set to the number of items you have
var doAddItem =
function() {
currentIndex++;
var newItem = $("#templateDiv").clone();
newItem.attr("id", "item" + currentIndex); // reset the ID here
newItem.find("input[name=MyModelObjects.Index]").val(currentIndex);
newItem.find("input[name$=.Name]").attr("name", "MyModelObjects[" + currentIndex + "].Name");
newItem.find("input[name$=.Value]").attr("name", "MyModelObjects[" + currentIndex + "].Value");
newItem.insertBefore($(this).closest("div")); // insert it before the div containing the add link...adjust appropriate to your layout
return false;
}
$(document).ready(function() {
$("#addItem").click(doAddItem);
// In a real-world app you'd probably want to have a delete option, too
});
ОБНОВЛЕНИЕ 2 Естьтам немного ошибки - если ваше представление набрано на IEnumerable<object>
, тогда ваши имена полей в конечном итоге будут просто Index
и [0].Name
/ [0].Value
.В моем реальном приложении я использую модель представления, которая имеет свойство, которое само по себе является перечисляемым, поэтому я на самом деле печатаю свои страницы как <MyViewModelObject>
.В приведенном выше примере этот объект модели представления будет иметь свойство с именем MyModelObject
, которое будет перечислимым (и более реалистично называемым MyModelObjects
во множественном числе).