2012-01-12 3 views
10

Есть ли проблемы с привязкой модели IEnumerable к MVC POST?Modelbinding IEnumerable в ASP.NET 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 данные.

+0

Несмотря на downvoted, я действительно надеюсь, что кто-то, кто имел подобные проблемы натыкается этот вопрос и получает лучшее понимание проблемы ... – Arkiliknam

+0

Я не уверен ... почему многие хорошие вопросы без слов объясняются ... Я наткнулся на это и нашел полезным. Благодарю. –

ответ

8

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

Я не уверен, что это инфакт, потому что я использую ToArray или нет, но изменение его в реальном массиве работало исправлено. – Arkiliknam

+0

u может проверить сгенерированный html и быть уверенным в этом –

0

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

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

+0

Я использую цикл for, потому что мне нужно сделать TextBoxFors, которые принимают предикатный параметр Model, чтобы определить, какой элемент коллекции в моей модели я создаю для этого TextBoxFor. Индекс - это просто способ отслеживания этих элементов. С циклом foreach я теряю контекст того, откуда пришел элемент. Насколько я знаю, этот способ не является неэффективным в сравнении, особенно если я использую Массивы, поскольку скорость равна O (1). – Arkiliknam

Смежные вопросы