Как связать ретранслятор с List <Person>, чтобы также обновить связанные элементы? (2 пути)

Если у меня есть список <Person> где человек определяется классом

class Person
{
   string Forename
   {
      get;set;
   }
   string Surname
   {
      get; set;
   }
}

И я привязываю его к элементу управления репитером asp, который выглядит так:

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Label ID="lblForename" runat="server" Text="Forname" AssociatedControlID="txtForename" />
        <asp:TextBox ID="txtForename" runat="server" Text='<%# ((Person)Container.DataItem).Forename %>' />
        <br />
        <asp:Label ID="lblSurname" runat="server" Text="Forname" AssociatedControlID="txtSurname" />
        <asp:TextBox ID="txtSurname" runat="server" Text='<%# ((Person)Container.DataItem).Surname %>' />
        <br />
    </ItemTemplate>
</asp:Repeater>

Каков наилучший способ получить данные, которые пользователь вводит обратно в объекты?

Я думал, что весь смысл привязки данных состоит в том, что это было эффективно обработано для вас, но когда я проверяю коллекцию Repeater1.Items, изменений не происходит. Должен ли я писать код, чтобы что-то делать в строках

//This is only intended to be pseudo code
for each item in Repeater1.Items
    ((Person)item.DataItem).Forename = item.FindControl("txtForname").Text;
end for

Если это так, почему свойство DataItem всегда пусто?

Дополнительная информация:

Я уже вызываю код, эффект

this.Repeater1.DataSource =  this.PersonList;
this.Repeater1.DataBind();

Я пробовал использовать Bind("Forename"), но это, похоже, не возвращает информацию из TextBox в объект, мне нужно сделать это вручную?

Ответы

Ответ 1

Простой ответ заключается в том, что элемент управления Repeater не поддерживает тип двусторонней привязки данных, которую вы ищете. Кроме того, свойство DataItem используется только во время создания элемента ретранслятора, а после события ItemDataBound оно ничего не имеет. Таким образом, вы не можете использовать это свойство для получения исходного объекта, который вы использовали при создании определенного элемента ретранслятора после обратной передачи (как вы делаете в псевдокоде).

Вам нужно будет прокрутить элементы ретранслятора, как вы предложили (обязательно убедитесь, что элемент принадлежит ListItemType.Item или AlternatingItem, прежде чем что-либо делать), а затем извлеките значения из текстовых полей и используйте их в обновлении.

Ответ 2

Если вы привязываете ретранслятор к списку лиц, который вам нужен, например

this.Repeater1.DataSource =  GetPersons();

в то время как GetPersons() - метод, возвращающий список личных объектов вы можете использовать

<asp:TextBox ID="txtForename" runat="server" Text='<%# Eval("Forename") %>' />

Ответ 3

В дополнение к вышесказанному вам также необходимо привязать ретранслятор к списку. Прямо сейчас текстовым полям присваивается значение Forename (или потенциально связанное, если вы используете

<# Bind("Forename") %>
тег

), но в контейнере Repeater нет DataItem.