动态地将控件添加到控件列表中

时间:2011-02-07 13:52:38

标签: c# .net asp.net .net-4.0

我有一个网页,用户需要输入客户联系信息。他们可以从0进入无限数量的联系人。

我在页面上创建了此页面代码:

<ajaxToolkit:ToolkitScriptManager runat="Server" EnablePartialRendering="true" ID="ScriptManager1" />
<asp:PlaceHolder ID="phCustomerContacts" runat="server" EnableViewState="true">/asp:PlaceHolder>
<asp:LinkButton ID="btnAddContact" runat="server" OnClick="btnAddContact_Click" CssClass="LinkButton" Text="Add Contact"/>

在我的代码中我添加了这个:

   public void btnAddContact_Click(object sender, EventArgs e)
    {
        IList<CustomerContactProfile> customerContacts = new List<CustomerContactProfile>();
        if (ViewState["CustomerContactList"] != null)
            customerContacts = (List<CustomerContactProfile>)ViewState["CustomerContactList"];
        CustomerContactProfile contactProfile = (CustomerContactProfile)LoadControl("~/Controls/Embedded/CustomerContactProfile.ascx");
        customerContacts.Add(contactProfile);

        foreach (CustomerContactProfile contact in customerContacts)
            phCustomerContacts.Controls.Add(contact);

        ViewState["CustomerContactList"] = customerContacts;
    }

此代码不起作用,因为ViewState无法处理存储所有控制数据。但是,我想不出另一种存储已添加控件的方法。

asp:PlaceHolder控件的视图状态不保存任何内容,我需要保存控件,以便在用户向第一个控件输入一些数据时,如果数据在添加时没有丢失第二个等等。

6 个答案:

答案 0 :(得分:1)

不是存储整个控件,只需将基础数据存储在会话中,并在每次重新加载页面时从该数据重建控件集。

答案 1 :(得分:0)

我不确定这是动态添加联系人的最佳方式。通过jquery创建控件并将创建数据发送到Web方法不是更好吗?

答案 2 :(得分:0)

最好将视图状态中的控件数量存储为添加...然后在Page Init或PreInit中添加它们...然后将为每个动态控件保留ViewState。这当然是在按钮点击后回发。

HTH。

答案 3 :(得分:0)

存储用户在视图状态中输入的控件数。覆盖LoadViewState页面方法并在其中添加控件数。该框架将负责将发布的数据重新加载到您的控件中。你不会丢失信息。您只需确保在恢复视图状态之前添加控件。

答案 4 :(得分:0)

将其存储在Session而不是Viewstate中。它同样糟糕但它会起作用!

答案 5 :(得分:0)

我认为您不应该依赖任何临时存储 - Viewstate,Session或其他。

你似乎正在使用你的.ascx,就像我通常会使用一个类......但是,我想,用户控件会更大,因为它中有很多html(?)。

无论如何,一个类的通用列表至少会更小。

但是,除此之外,我最喜欢的方法是将每条记录插入数据库(一个接一个) - 至少是手动输入,这是我对你正在使用的印象。例如,使用listview,detailsview,gridview等