Razor ASP.NET MVC 4-for循环发布模型集合属性,但foreach不发布

Razor ASP.NET MVC 4-for循环发布模型集合属性,但foreach不发布,razor,asp.net-mvc-4,foreach,Razor,Asp.net Mvc 4,Foreach,假设我有以下型号: 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; } } 当我发布时,不会遇到IEnumerable。如果我在F

假设我有以下型号:

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; }
}
当我发布时,不会遇到
IEnumerable
。如果我在Fiddler中查看它,集合只发布一次,并且没有枚举集合,因此我得到:

People.Name = "whatever"
People.Age = 99
但是,如果我将人员更改为
IList
,并使用for循环而不是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>
}
for(var i=0;iModel.People[i].Name) @Html.TextBoxFor(m=>Model.People[i].Age) }
它起作用了。我做错什么了吗?我缺少什么?

问题不在于
IEnumerable
IList
在视图中呈现集合的方式

@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>
}
for(var i=0;iModel.People[i].Name) @Html.TextBoxFor(m=>Model.People[i].Age) } 请注意,对于每个列表项,您都附加了一个连续索引,使模型绑定器能够发挥其魔力


一个

你所错过的只是放置var,而不是像下面这样的模型本身(人)

<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" />

@foreach(Model.People中的人)
{
@Html.TextBoxFor(m=>person.Name)
@Html.TextBoxFor(m=>person.Age)
}

这是正常行为。模型绑定器使用呈现html中输入元素的name属性。将for循环与索引器一起使用是唯一的方法,模型绑定器可以将其与模型关联。这在Generic.IEnumerable集合上不起作用,因此您需要将集合更改为某种形式的可索引集合。对于post请求不起作用,因为json反序列化器将无法匹配这些名称属性。它正在工作,但每个输入表单都有相同的名称和值。@nam表示在razor视图中,循环正在工作并生成它相应的html元素。但每个“名称”输入字段id和名称都是“名称”,每个“年龄”输入字段id和名称都是“年龄”
@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>
}
<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" />