ASP.NET MVC - представление вставки или обновления с моделью IEnumerable - PullRequest
2 голосов
/ 23 сентября 2010

Я видел множество примеров (NerdDinner, спортивный магазин Сандерсона и т. Д.), В которых представление привязано к коллекции объектов.Синтаксис в представлении обычно выглядит примерно так ...

<%@ Page... Inherits="System.Web.Mvc.ViewPage<IEnumerable<MyViewModel>>" %>
...
<% foreach (var myViewModel in Model) { %>

Я также видел множество примеров вставок или обновлений, где контроллер автоматически связывает параметр модели с элементами формы в представлении.

Я ищу сочетание двух техник, в которых мое представление имеет элементы формы, относящиеся к коллекции myViewModel, где каждый myViewModel имеет 3-4 свойства.Цель состоит в том, чтобы позволить пользователю ввести набор из них за один дубль.

Если это возможно, может ли кто-нибудь помочь мне с синтаксисом?Я не могу понять, как пометить элементы формы, чтобы заставить работать привязку.

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

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

[HttpPost]
public ActionResult CreateFoos(List<Foo> foos)
{
   // I have a list of the foo objects that were posted
}

А затем, в представлении, предположим, что вы хотите создать форму для каждого объекта:

<% for (int i = 0; i < Model.Count; i++) { %>
    <%: Html.TextBoxFor(x => x[i].Property1) %>
    <%: Html.TextBoxFor(x => x[i].Property2) %>
    <%: Html.TextBoxFor(x => x[i].Property3) %>
<% } %>

Обратите внимание накак элементы управления отображаются в HTML, потому что в вашем представлении «создание» может потребоваться кнопка javascript, позволяющая пользователю добавить еще одну запись, и вам придется увеличивать индекс для каждого дополнительного элемента управления.Это не так сложно, но я просто хотел предупредить вас, чтобы вы обратили внимание на источник, который он на самом деле генерирует.

3 голосов
/ 23 сентября 2010

Окончательный ответ здесь: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Вам необходимо назвать каждое поле, как если бы оно было частью массива: "PropertyName [i]"

...