2011-02-07 78 views
8

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

+1

任何特殊的原因,它必须在视图状态?您可以尝试使用会话。 – asawyer 2011-02-07 14:05:50

+0

会话会很好,但如果用户离开页面不会填满会话吗? – 2011-02-07 14:11:09

+1

会话绝对不是基于页面状态的地方。首先,这意味着,除非采取额外措施,否则用户无法在两个单独的窗口中查看其中的两个页面 - 这在大多数Web应用程序中都应该可以实现。 – 2011-02-07 16:20:00

回答

1

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

0

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

0

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

HTH。

0

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

0

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

0

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

您似乎正在使用.ascx,就像我通常会使用类一样...虽然我想,用户控件会变得更大,因为它有很多html(?)。

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

但是,除此之外,我最喜欢的方法是将每条记录插入数据库(一个一个地完成) - 至少对于手动输入而言,这是我对您正在处理的内容的印象。例如,使用listview,detailsview,gridview等。