Disons que j'ai les modèles suivants:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Town
{
public string Name { get; set; }
public IEnumerable<Person> People { get; set; }
}
Ensuite, dans ma vue Razor, j'ai ceci:
@model Town
@using(Html.BeginForm())
{
<table>
@foreach(var person in Model.People)
{
<tr>
<td>@Html.TextBoxFor(m => person.Name)</td>
<td>@Html.TextBoxFor(m => person.Age)</td>
</tr>
}
<table>
<input type="submit" />
}
Ensuite, j'ai une action pour le POST, quelque chose comme ceci:
[HttpPost]
public ActionResult Index(Town theTown)
{
//....
}
Quand je poste, le IEnumerable<Person>
ne tombe pas. Si je le regarde dans Fiddler, la collection ne publie qu'une seule fois et n'énumère pas la collection. Je reçois donc:
People.Name = "whatever"
People.Age = 99
Cependant, si je change People en IList
et utilise une boucle for à la place de foreach ...
@for(var i = 0;i < Model.People.Count;i++)
{
<tr>
<td>@Html.TextBoxFor(m => Model.People[i].Name)</td>
<td>@Html.TextBoxFor(m => Model.People[i].Age)</td>
</tr>
}
Ça marche. Est-ce que je fais quelque chose de mal? Qu'est-ce que je rate?
le problème ne vient pas de IEnumerable
ni de IList
mais de la manière dont vous rendez la collection dans votre vue.
@for(var i = 0;i < Model.People.Count;i++)
{
<tr>
<td>@Html.TextBoxFor(m => Model.People[i].Name)</td>
<td>@Html.TextBoxFor(m => Model.People[i].Age)</td>
</tr>
}
Notez qu'avec chaque élément de la liste, vous ajoutez un index continu qui permet au classeur de modèle de faire sa magie.
Tout ce que vous avez manqué était de placer var au lieu du modèle lui-même (People),
<table>
@foreach(People person in Model.People)
{
<tr>
<td>@Html.TextBoxFor(m => person.Name)</td>
<td>@Html.TextBoxFor(m => person.Age)</td>
</tr>
}
<table>
<input type="submit" />