中继器数据绑定丢失数据&回发事件 - 是否有最佳实践解决方案?

时间:2010-10-07 11:16:06

标签: asp.net data-binding

目前正在努力解决我过去遇到的问题。目前,一个有价值的解决办法逃脱了我,但这似乎是一个显而易见的问题,我不禁想知道我是否应采用“最佳实践”方法。

没有代码,简而言之就是问题:

  • 页面具有数据绑定控件(转发器),在用户输入数据并单击按钮之前,该控制器不会被填充。
  • 转发器项目模板包含一个按钮
  • 用户点击按钮,页面回发。在加载时,转发器实际上是空的,因此从不处理事件,因为原始控件不再存在
  • 回到可怜的周期的开始

我已经确认这是问题所在,因为如果您在转发器上为页面加载提供一些静态数据,那么一切正常。但当然这没用,因为它必须动态填充。

这种头痛是否有一种普遍认可的方式?我可以将数据存储在会话中并在页面加载时重新使用它,但它看起来非常笨拙。

干杯, 马特

2 个答案:

答案 0 :(得分:2)

如果事件是由转发器中的按钮触发的,那么这将冒泡到转发器ItemCommand事件。使用CommandName和CommandArgument参数按钮,您可以识别单击了哪个按钮并相应地执行操作。下面是一些基本的标记和代码,用于演示方法:
HTML:

<asp:Repeater ID="rptTest" runat="server" onitemcommand="rptTest_ItemCommand" 
    onitemdatabound="rptTest_ItemDataBound">
    <ItemTemplate>
        <p>
            <asp:Button ID="btnTest" runat="server" />
        </p>
    </ItemTemplate>
</asp:Repeater>
<asp:Button ID="btnLoad" runat="server" Text="Load" onclick="btnLoad_Click" />

事件背后的代码:

protected void rptTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

    Button button = (Button)e.Item.FindControl("btnTest");
    button.Text = string.Format("Button {0}", e.Item.DataItem.ToString());
    button.CommandName = e.Item.ItemIndex.ToString();
}

protected void rptTest_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    Response.Write(string.Format("Postback from button {0}", e.CommandName));
}

protected void btnLoad_Click(object sender, EventArgs e)
{
    List<int> list = new List<int>();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(4);
    rptTest.DataSource = list;
    rptTest.DataBind();
}

希望我已经理解了这个问题,这会有所帮助。

答案 1 :(得分:2)

如果您的任何控件是动态创建的,那么必须在回发期间重新创建它们,以便重新启动事件等。

如果是这种情况,请查看control built by a guy named Denis Bauer。我们只需稍加修改就可以使用它,它非常完美。