2012-06-14 30 views
1

我在一家新公司,並且正在爲Web應用程序(.Net/4.0)構建嚮導。用戶在嚮導過程中轉到幾個單獨的屏幕,並且在嚮導完成之前必須返回到原始屏幕。這與他們通常如何做到這一點不同。但這是如何完成的。在Web應用程序中對自定義對象進行清理

一種選擇是將每個面板的結果存儲在數據庫的主屏幕中。那麼,當用戶離開&重定向回來。我可以檢查一個查詢字符串,然後調用一個datareader並適當地填充原始值。

我選擇的選項: 我創建了一個對象,並將用戶輸入的結果存儲到該對象中。當用戶離開&重定向回來時,通過查詢字符串檢查並通過BO填充控制值。

我在HttpContext.Current.Session.Item("BO")中存儲對象並調用它。

我的問題是,這是做這個不好的方法? 如果我不想做什麼事情來確保從會話中刪除對象,無論用戶何時退出嚮導。 如果不好,你會怎麼做?我不怕建設性的批評,我是新的。

+0

我想在會話中存儲是一個上帝的想法,我會這樣做。重新標記這個問題,但我覺得它主要是一個ASP.net問題 – Vamsi

+0

好的,我需要先做任何事情來最好地存儲。某種序列化?這是自己的手柄。怎麼消除它。當嚮導完成時,我希望它明顯消失。但其他的事情呢,失去連接,超時等... –

+0

對不起,這麼晚回覆,但我看到你選擇的答案几乎總結了我會說:) – Vamsi

回答

2

我使用Session對象做了這樣的事情。就性能(序列化)以及類似的情況,我不得不在個案基礎上說明這一點,如果您的自定義類很大並且包含多個其他自定義類,那麼序列化可能會有所幫助,但是如果它們相對較小並且僅包含原始數據類型,然後序列化可能會過度殺死,並很快就會產生反效果。

至於控制對象停留在會話中的時間長度,您已經說過,爲了完成嚮導,他們必須返回到起始頁面或控制器頁面或任何您想要調用的對象。所以我想,當他們點擊「保存」或「完成」時,你可以在保存功能末尾添加一行,如Session("BO") = nothing(或者Session.Remove("BO")將完成相同的操作),並從Session容器釋放對象。如果您想在完成嚮導之前離開頁面時清除會話,那麼可能會稍微麻煩一點。至於丟失的連接和超時等等,我的理解是,瀏覽器將這兩種情況視爲會話被放棄,因此下次用戶打開頁面時,這將是一個全新的會話。

但我不擔心過去所做的是確保每次嚮導啓動時清除我計劃使用的Session成員,如果它尚未nothing然後重新創建它與一個新鮮的對象。

Session方法或viewstate方法的唯一問題是,兩者都不是特別安全,所以如果您要處理敏感數據,您可能需要加密存儲在Session中的值。

這篇文章在我第一次開始使用緩存和會話對象時幫助了我。 Cache Management in ASP.NET

+0

你知道有關加密存儲在會話中的數據的任何好文章嗎? –

+1

當我在網上搜尋時發現了另一個堆棧溢出問題,如果你可以通過小小的爭論來挖掘,那麼這裏有一些好的信息。基本上jist是,只要你對服務器有信心,你並不需要加密會話數據。 http://stackoverflow.com/questions/4027023/does-sensitive-asp-net-session-data-need-to-be-encrypted –

1

如果嚮導全部位於同一頁面上,只需發回以獲取嚮導的每個屏幕,就可以使用viewstate來實現此目的。這可以解決您提出的問題,即使用戶離開向導時,仍有可能讓對象保留在會話中。

查看關於ViewState的MSDN上的以下文章: ASP.NET View State Overview

您還可以使用視圖狀態來存儲特定 到頁面的應用程序數據。

雖然有一些使用viewstate的注意事項。您不想將大量的數據傳遞給用戶瀏覽器進行狀態管理。存儲在視圖狀態中的類也必須是可序列化的。引用MSDN文章:

視圖狀態信息被序列化成XML,然後使用鹼-64編碼由 編碼,這可以生成大量數據。當 頁面發佈到服務器時,視圖狀態的內容將作爲頁面回發信息的一部分發送到 。如果視圖狀態包含大量信息,則可能會影響頁面的性能。 通過使用 應用程序的典型數據來測試頁面的性能,以確定視圖狀態的大小是否導致 性能問題。

...的類必須用Serializable屬性來編譯,以便其 值可序列化的視圖狀態。

替代品使用ViewState的,請參閱MSDN上的以下內容: ASP.NET State Management Recommendations

+0

問題是他們使用模態疊加這不是同一個頁面,它重定向到一個全新的.aspx頁面,如果從該向導訪問頁面,我必須編寫代碼重定向回頁面。查詢字符串。我沒有這與WCF,我有代碼在家裏,通過當前做到這一點。請求。但是我們要求另一個頁面,所以current.request沒有我需要完成的一生。 –

相關問題