ASP.NET MVC 4 – para propriedades de coleção de modelo de postagens em loop, mas foreach não

Digamos que eu tenha os seguintes modelos:

public class Person { public string Name { get; set; } public int Age { get; set; } } public class Town { public string Name { get; set; } public IEnumerable People { get; set; } } 

Então, na minha visão Razor, eu tenho isto:

 @model Town @using(Html.BeginForm()) {  @foreach(var person in Model.People) {  } 
@Html.TextBoxFor(m => person.Name) @Html.TextBoxFor(m => person.Age)
}

Então, eu tenho uma ação para o POST, algo assim:

 [HttpPost] public ActionResult Index(Town theTown) { //.... } 

Quando eu postar, o IEnumerable não aparece. Se eu olhar no Fiddler, a coleção só publica uma vez e não enumera a coleção, então eu recebo:

 People.Name = "whatever" People.Age = 99 

No entanto, se eu mudar as pessoas para um IList e usar um loop for em vez de um foreach …

 @for(var i = 0;i < Model.People.Count;i++) { 
}

Funciona. Estou fazendo algo errado? o que estou perdendo?

o problema não é com o IEnumerable ou o IList do jeito que você está renderizando a coleção em sua view.

 @for(var i = 0;i < Model.People.Count;i++) { 
}

Observe que, com cada item da lista, você está anexando um índice contínuo que permite que o fichário do modelo faça sua mágica

Uma boa leitura

Tudo o que você perdeu foi colocar var em vez do próprio modelo (People) como abaixo

 
@Html.TextBoxFor(m => Model.People[i].Name) @Html.TextBoxFor(m => Model.People[i].Age)
@Html.TextBoxFor(m => Model.People[i].Name) @Html.TextBoxFor(m => Model.People[i].Age)
@foreach(People person in Model.People) { }
@Html.TextBoxFor(m => person.Name) @Html.TextBoxFor(m => person.Age)