Подтвердить что ты не робот

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

Затем в моем представлении "Бритва" у меня есть следующее:

@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, коллекция будет размещать только один раз и не перечисляет коллекцию, поэтому я получаю:

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

Однако, если я сменил People на 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>
}

Это работает. Я делаю что-то неправильно? Что мне не хватает?

4b9b3361

Ответ 1

проблема не в том, что 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>
}

Обратите внимание, что с каждым элементом списка вы добавляете непрерывный индекс, который позволяет связующему устройству модели делать свою магию

A хорошее чтение

Ответ 2

Все, что вы пропустили, заключалось в размещении var вместо самой модели (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" />