2012-03-03 114 views
0

我有一個ASP.Net創建用戶嚮導。我包含的其中一個額外步驟是收集客戶可能與其同事建立連接的聯繫信息,以便配置的帳戶也可以批量創建登錄。我用於ContactPerson的用戶由多個用於關鍵信息(名稱,DoB,公司名稱,地址和州)的文本框組成。建議:堅持用戶輸入動態創建用戶控件

我使用一個簡單的按鈕來調用AddContacts方法,該方法創建用於RadPanelItems的正確的嵌套結構。只要我添加第一個項目就可以正常工作,但第二個項目通過回發和缺乏數據持久性消除了第一個項目。

此用戶控件映射到EF4實體,具體而言,該頁面有一個名爲List ContactList的成員。我想問一下,如果我遇到從前面的聯繫人收集到的實體數據,並且在遇到回發時重新添加用戶控件(包含所述數據)返回到表單,那麼最佳方式是什麼?

我願意接受建議,我正在尋找最佳實踐解決方案。提前致謝。

回答

2

直到你堅持你的數據,你可以使用HttpContext.Current。 Session存儲此信息的對象。會話(存儲在服務器上)適用於較大的數據,因此可以將較小的數據用於存儲在頁面的隱藏字段中的ViewState,因爲每次請求都會發送來回數據並快速打開頁面大小。爲了討論見ViewState Vs Session ... maintaining object through page lifecyclehttp://msdn.microsoft.com/en-us/library/ms972976.aspx

Annother選項(不是一個好您的具體情況)可以像具有好處是可以複製的URL粘貼到電子郵件,仍然有ID或主鍵非常小的數據QueryParameters信息。請參閱http://www.codeproject.com/Articles/5876/Passing-variables-between-pages-using-QueryString

回到您的問題:對於您添加的每個新聯繫人,執行類似的操作直至最終保留數據。

var contacts = new List<EF4Entity>() 
if (Session["Contacts"] != null){ 
    contacts = Session["Contacts"] as List<EF4Entity> 
} 

var newContact = new EF4Entity() 
//fill your new contact here 
contacts.Add(newContact) 

//bind your RadPanelItems here 

//store it to the session 
Session["Contacts"] = contacts 
+1

既然我們使用InProc會話狀態,那麼這種方法會有什麼意想不到的後果嗎?這看起來像是可行的答案,如果它與InProc一起工作。 – jjhayter 2012-03-04 03:49:24

+0

存儲在Session中的對象必須是[Serializable],無論如何它們是大多數對象,一些自定義需要[Serializable],一些實現序列化的更多工作...但我們不要超前。你有一個很好的機會,它會正常工作! InProc會話受限於在IIS中配置的可用內存。但只要你臨時存儲這些對象,而不處理1000個用戶同時註冊 - 我不會擔心這一點。如果你需要更多的會話空間,研究SQLSession將是一種選擇。 – Elementenfresser 2012-03-04 07:02:21

0

您將需要除非你堅持使用一箇中間存儲位置和檢索數據的數據庫,每一個請求(我覺得呆板任何複雜的業務應用程序)。

下面是我如何處理它。

我已經寫了一個ASP.Net會話的包裝,以確保我有唯一的對象鍵,並且我可以強制Session中每個用戶的最大數量的對象。我的每個頁面都綁定到一個實現了簡單接口的對象(我稱之爲IModel)。這樣,我可以一致地處理每個頁面/視圖的模型,並且可以使任何頁面狀態感知。

動態控件將直接添加到頁面的模型中或添加到後代。此方法輕鬆支持簡單或複雜的對象結構,並且還允許在頁面之間共享數據。