Modelbinding IEnumerable в ASP.NET MVC POST?

Есть ли проблемы с возможностью сопоставления типов 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, которое запускается, только признает тестовую строку как свойство. Состояние модели также не содержит мои IEnumerable данные.

Ответ 1

Связывание с моделью зависит от того, как выглядит сгенерированный 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%>

и остальное будет обрабатываться самой картой

Ответ 2

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

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