Связывание моделей IEnumerable в ASP.NET MVC POST? - PullRequest
10 голосов
/ 12 января 2012

Есть ли какие-либо проблемы с привязкой моделей IEnumerable к MVC POST?

Некоторые свойства в моей модели не привязаны к сообщению к действию.Кажется, что свойства на модели, такие как строки, в порядке, но мой IEnumerable - это то, что не связано.

Вот фрагмент моего кода:

<%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.Test) %>
    <% for (int i = 0; i < Model.ResponseInfo.SubsetInfo.BandAvailabilities.Count(); i++)
    {%>
        <%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities.ToArray()[i].BandName) %>
  <% } %>

А вот как выглядят эти свойствакак в модели:

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }
public string Test { get; set; }

Представление работает нормально и выводит список текстовых полей с ожидаемыми значениями в них.Но действие Post, которое запускается, только распознает строку Test как свойство.Состояние модели также не содержит моих данных IEnumerable.

Ответы [ 2 ]

8 голосов
/ 12 января 2012

Привязка модели зависит от того, как выглядит сгенерированный html. для конкретного сценария, чтобы правильно связать HTML должен выглядеть как

<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[0].BandName"/>
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[1].BandName"/>
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[2].BandName"/>
.
.
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[n].BandName"/>

Я не пробовал, но я почти уверен, что вызов метода ToArray в цикле не позволяет системе генерировать собственные имена для вложенных входных данных. Есть несколько вещей, которые вы можете сделать, чтобы исправить это Во-первых, на ваш взгляд, изменение модели

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }

до

public IList<BandAvailabilityInfo> BandAvailabilities { get; set; }  //or Array

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

 <%: Html.EditorFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities%>

, а остальное будет обрабатываться самой платформой

0 голосов
/ 12 января 2012

Работает нормально с типом IEnumarble.
Я думаю, проблема в том, что ToArray вы пишете внутри цикла For. (Это тоже очень не эффективно)
измените цикл for на foreach.

См. этот отличный ответ, как этого добиться.

...