2011-02-07 77 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等。