40

次のモデルがあるとします。

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; }
}

次に、Razor ビューには次のように表示されます。

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

次に、次のような POST のアクションがあります。

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

私が投稿するとき、IEnumerable<Person>は出くわしません。Fiddler で見ると、コレクションは 1 回だけ投稿され、コレクションは列挙されないため、次のようになります。

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

ただし、People を for に変更しIList、foreach の代わりに for ループを使用すると...

@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>
}

できます。私は何か間違ったことをしていますか?私は何が欠けていますか?

4

2 に答える 2

62

問題は、ビューでコレクションをレンダリングする方法ではあり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>
}

各リスト項目に連続インデックスを追加していることに注意してください。これにより、モデル バインダーがその魔法を実行できるようになります。

よく読ん

于 2013-01-04T22:01:39.777 に答える
0

あなたが逃したのは、以下のようにモデル自体(People)の代わりに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" />
于 2014-03-27T12:29:46.227 に答える