手动绑定转发器中的行,以避免丢失视图状态数据

时间:2014-04-08 15:10:13

标签: c# asp.net postback repeater viewstate

我正在使用转发器显示自定义控件列表的页面上工作,每个控件都包含两个下拉列表。

单击Add control按钮,页面会在转发器上添加一个新行,单击每个控件中嵌入的Delete control按钮之一会从转发器中删除相关控件。

删除部分似乎有效,(将NamingController.Visible设置为false),但添加部分失败,因为一旦添加新控件,对新repeater.DataBind()的调用就会丢失所有viewstate数据,防止下拉列表检索回发前的值。

有没有办法在不调用完整数据绑定的情况下手动将添加的控件绑定到转发器?或者有没有其他方法来添加控件而不会丢失数据?

这里有一些代码(我只留下了相似的内容,如果您认为我忘了指定内容,请告诉我):

Page.aspx:

<asp:Button ID="addControl" runat="server" Text="Add control" />
<asp:Repeater ID="repeater" runat="server" OnItemDataBound="repeater_ItemDataBound">
    <ItemTemplate>
        <uc:CustomControlWithDropDownLists ID="custom" runat="server" />
    </ItemTemplate>
</asp:Repeater>

Page.aspx.cs:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    repeater.DataSource = GetDataSource();
    repeater.DataBind();
}

protected void Page_Init(object sender, EventArgs e)
{
    addControl.Click += (sndr, args) =>
    {
        // Create the object we want to bind to the repeater
        ObjectToBind objectToBind = new ObjectToBind();

        // Here is what causes data loss
        ((IList<ObjectToBind>)repeater.DataSource).Add(objectToBind);
        repeater.DataBind();
    };
}

protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        // Do some stuff
    }
}

CustomControlWithDropDownLists.ascx:

<%-- Some dropdown lists --%>
<asp:Button ID="deleteControl" runat="server" Text="Delete control" />

CustomControlWithDropDownLists.ascx.cs:

protected void Page_Init(object sender, EventArgs e)
{
    deleteControl.Click += (sndr, args) =>
    {
        // ... Delete the control ...

        ((Button)sndr).NamingContainer.Visible = false;
    };
}

2 个答案:

答案 0 :(得分:0)

我过去曾做过类似的事情,发现这个来自c-sharp角落的链接很有帮助。 http://www.c-sharpcorner.com/Blogs/10913/add-dynamic-row-using-repeater.aspx

如果内存服务器使用ViewState对象并相应地绑定,那么关键元素就是我。

myObject = ViewState [&#34; MyData&#34;];等。

(对不起,我现在无法访问我的代码)

答案 1 :(得分:0)

由于View状态,您正在丢失数据。 当我们重定向到另一个页面时,View State会丢失数据。 视图状态仅存储特定页面的数据。 您转到另一个页面的那一刻数据会因视图状态而丢失。 &安培;由于许多原因,很有可能在同一页面上丢失数据。 因此,存储数据的最佳方法是使用会话变量。 即使您重定向到另一个页面,Session也会存储数据。 这是存储数据的最佳方式。

默认情况下,它会将数据存储20分钟。

我希望这能解决你的问题。