我有一个网页,用户需要输入客户联系信息。他们可以从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
控件的视图状态不保存任何内容,我需要保存控件,以便在用户向第一个控件输入一些数据时,如果数据在添加时没有丢失第二个等等。
答案 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等