Я не использовал EF еще, но у меня есть подобное требование на нашем сайте. Я выполнил его, указав View как наследующий 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. Впечатывание для представления изменилось бы, но в принципе дизайн представления не будет.
UPDATE Используя приведенный выше пример, вот краткий фрагмент кода 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
});
UPDATE 2 Там немного ошибки там - если ваш взгляд набирается на IEnumerable<object>
тогда ваши имена полей в конечном итоге будет только Index
и [0].Name
/[0].Value
. В моем фактическом приложении я использую модель представления, которая имеет свойство, которое само перечислимо, поэтому я на самом деле печатаю свои страницы как <MyViewModelObject>
. В приведенном выше примере этот объект модели представления будет иметь свойство, называемое MyModelObject
, которое было бы перечислимым (и более реалистично называемым числом MyModelObjects
).
Вау, я не думал так раньше. это идеальная идея. Я не попробовал, но логика имеет смысл для меня и очень уверена, что это сработает. Не могли бы вы дать мне подсказку о коде jquery, чтобы клонировать раздел ввода шаблона? Большое спасибо, кстати. это значило для меня много. – tugberk
Добавлен код. Имейте в виду, что ваш контроллер должен будет принять модель, и вам придется вставлять каждый элемент в коллекцию. –