【问题标题】:asp.net repeater data after postback回发后的asp.net转发器数据
【发布时间】:2012-04-12 10:54:42
【问题描述】:

在我的 .ascx 控件中:

<asp:Repeater ID="rptProducts" runat="server">
    <ItemTemplate>
        <asp:Label ID="lblProductName" runat="server">
            <%# Eval("Name") %>
        </asp:Label>
    </ItemTemplate>
</asp:Repeater>

<asp:Button ID="btnGo" runat="server" Text="Postback" onclick="btnGo_Click" />

在代码隐藏中:

protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostBack){
        var products = (from p in context.Products
                        select p).Take(30);

        rptProducts.DataSource = products;
        rptProducts.DataBind();
    }
}

我想知道为什么我的中继器在我点击那个按钮后会丢失它的数据。(回发)

【问题讨论】:

  • 不应该。 btnGo_Click 里面发生了什么?
  • 你是什么意思“中继器丢失它的数据” 它是空白的,这意味着所有的控件都被清除了吗?您是否尝试在按钮单击事件中访问中继器值?
  • 在按钮事件中我什么都不做。它只是用来触发回发。我所说的丢失数据的意思是,转发器中的所有行在回发之后都消失了。

标签: c# asp.net data-binding repeater


【解决方案1】:

改为在OnInit 中绑定Repeater

http://codinglifestyle.wordpress.com/2009/10/08/repeaters-and-lost-data-after-postback-viewstate/

编辑:我假设您正在处理UserControlLoad 事件,该事件在PageLoad 事件之后引发.最迟必须在 Page_Load 中创建动态控件。

http://forums.asp.net/t/1191194.aspx

所以要么在 Page_Init 中绑定你的中继器,要么 - 我会推荐:

提供像BindData 这样的公共函数,可以从页面的加载事件中调用。这也是推荐的方式,因为页面是 UserControl 的控制器。

public void BindData()
{
    var products = (from p in context.Products
                    select p).Take(30);

    rptProducts.DataSource = products;
    rptProducts.DataBind();
}

【讨论】:

  • 根据一些未回答的问题,这可能相关也可能不相关,并且他确实在 if(!Page.IsPostback) 块中具有绑定,因此问题不在于转发器正在重新绑定以这种方式回发和丢失值。
  • 将绑定移动到 OnInit 没有任何区别。我看到整个互联网上有更多关于这个话题的讨论。难道这种行为是设计使然?还是错误?
  • @TysHTTP:你试过方法方法吗?我必须承认我以前没有听说过这种行为,但我总是从他们的控制器(例如页面)绑定我的用户控件。
猜你喜欢
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多