Repeater.Items上的DataItem始终为null

时间:2010-10-08 08:27:36

标签: asp.net null repeater dataitem

我将转发器的DataSource设置为List(MyProducts是一个简单的类,仅包含get / setter)。

在此和DataBind()之后,我可以在调试模式中看到每个Repeater.Items的DataItem为null。在进行回发并尝试更新MyProducts时,Repeater.Items [n] .DataItem仍为空,我无法投射它,无法完成我的工作。

为什么在我对转发器进行数据绑定时,每个RepeaterItem上都没有设置DataItem?我不能想/谷歌出来。我的代码的每个其他方面都正常工作(从MyProducts输出数据到aspx,例如:

<asp:TextBox runat="server" id="q" Text='<%# DataBinder.Eval(Container.DataItem, "Quantity")%>'></asp:TextBox>

更多代码:

public class MyProducts
    {
        public string Number
        {
            get; set;
        }

        public decimal Price
        {
            get; set;
        }

        public decimal Quantity
        {
            get; set;
        }

        public decimal Total
        {
            get { return Quantity * Price; }
        }
    }

生成:

public List<MyProducts> TheProducts
{
 get { // Invoking webservice, getting response as xml and converting it to a list of MyProducts }
}

我的用户控件:

// Bind products in cart
r.DataSource = TheProducts;
r.DataBind();
// Debugging "r.Items[n].DataItem" now shows "null", eventhough all objects has been correctly binded

编辑#2,调试信息。 DataSource被正确加载,但Repeater.Items [3] .DataItem为null。它应该有价值,对吗? screenshot


编辑#3, 我现在知道了,我认为在设置DataSource时DataItem总是可以访问的,并且没有考虑包含完整代码(我试图在Page_Load中访问它)。

用户编辑了数量值后,我想保存MyProducts的新数量。我通过放置一个包含MyProducts id的hiddenfield来解决它,这样我就可以手动查找并从那里获取MyProducts对象。

感谢emremp,Mark Avenius和其他所有投入的人。

2 个答案:

答案 0 :(得分:5)

您需要整个清单的目的是什么?呈现页面后,不保留Repeater绑定的列表。如果您需要保留它,您可以将其放入会话并根据需要检索它(例如,在Page_Load上):

private List<MyProducts> _myList;
protected void Page_Load(object sender, EventArgs e)
{
    _myList = Session[MYPRODUCTSKEY] as IList;
}

您也可以将它放入您的getter中(首先检查会话,并在必要时调用Web服务):

public List<MyProducts> TheProducts
{
 get 
 { 
     if(Session[MYPRODUCTSKEY] == null)
         Session[MYPRODUCTSKEY] = //invoke webservice
     return Session[MYPRODUCTSKEY] as List<MyProducts>;
 }
}

答案 1 :(得分:2)

http://www.netnewsgroups.net/aspnet/t4049-question-repeater-dataitem.aspx

“DataItem仅用于项目创建过程,即ItemCreated 和ItemDataBound方法(ItemCreated由于调用而发生 的DataBind)。“

您可以添加ItemDataBound方法并尝试获取DataItem。