如何将转发器绑定到List <Person>以更新绑定的项目?(2种方法)

ili*_*ian 15 asp.net data-binding repeater

如果我有一个List <Person>,其中person由类定义

class Person
{
   string Forename
   {
      get;set;
   }
   string Surname
   {
      get; set;
   }
}
Run Code Online (Sandbox Code Playgroud)

我将它绑定到一个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>
Run Code Online (Sandbox Code Playgroud)

获取用户输入的数据到对象中的最佳方法是什么?

我认为数据绑定的重点在于有效地处理了这个问题,但是当我检查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
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,为什么DataItem属性总是为空?

附加信息:

我已经在调用代码的效果了

this.Repeater1.DataSource =  this.PersonList;
this.Repeater1.DataBind();
Run Code Online (Sandbox Code Playgroud)

我尝试过使用Bind("Forename"),但这似乎没有将TextBox中的信息带回到对象中,我是否必须手动执行此操作?

pat*_*ech 8

简单的答案是Repeater控件不支持您正在寻找的那种双向数据绑定.最重要的是,DataItem属性仅在创建转发器项目期间使用,并且在ItemDataBound事件之后,它被设置为空.因此,您无法使用该属性来获取在回发后创建特定转发器项时使用的原始对象(就像您在伪代码中所做的那样).

您必须按照建议循环遍历转发器项(确保在执行任何操作之前检查该项是ListItemType.Item或AlternatingItem),然后从文本框中提取值并在更新中使用它们.


Ble*_*rta 7

如果您将Repeater与您想要的人员列表绑定在一起

this.Repeater1.DataSource =  GetPersons();
Run Code Online (Sandbox Code Playgroud)

而GetPersons()是一个返回您可以使用的人物对象列表的方法

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

  • 不,这会填充转发器,但它不会返回用户输入的数据.Eval是单向数据绑定,问题是询问双向数据绑定. (4认同)