2013-07-01 14 views
0

我有變化取決於用戶希望如何添加/刪除項目(數據項目的數據表)。爲了防止提交頁面中的會話變量過期,我應該將會話變量分配給viewstate變量嗎?

在整個Web應用程序的最後一頁是用來存儲數據表中的會話變量(,我有一個提交頁面,允許用戶提交數據表中的選定項目

因爲我認爲會話變量可能過期,如果頁面打開時間過長,並且爲了防止由過期變量引起的錯誤,在page_load函數的!IsPostBack我將會話變量分配給一個視圖狀態變量(因此數據將被存儲在頁面的視圖狀態中而不會過期)

if(!IsPostBack){ ViewState["myDataTable"] = Session["myDataTable"]}

1)這是標準做法,並且在將視圖狀態分配給視圖狀態時是否存在任何影響/錯誤?

2)致電ViewState["myDataTable"] = Session["myDataTable"]後,可以做Session["myDataTable"] = null嗎?

+0

使用'Profile'而不是'Session'。 – adatapost

+0

如何檢查回發時您的會話變量是否爲空,以防止過期會話中出現任何錯誤? –

+0

@Jonny這也是我想到的。但是如果我們希望它更加用戶友好,並且不希望用戶再次輸入數據,那麼您有什麼建議? –

回答

1

這實際上取決於您擁有的數據的種類和大小。

請記住,您需要將發送給客戶端的任何內容視爲受損數據。另一種說法是,如果你確定用戶有可用的表單,允許他們輸入數據的每一位,那麼就可以了。

所有說,視圖狀態通常是簽名,但history as proven是遵循這一般安全建議的好主意。

至於大小,您需要密切關注每個請求上交換的數據量。

最後關於清除會話值之後,asp.net mvc與它所稱的TempData類似。它的使用場景:在非post方案+和不希望查詢字符串中將一些數據從一個頁面傳遞到下一個頁面。

+0

如果數據的大小變得太大,將數據存儲在服務器上的文件中是一個好主意(並且在用戶想要將數據加載到頁面時讀回數據) –

+1

這取決於你的環境特徵。假設它是一個單一的Web服務器,如果你擔心這個問題,這絕對是避免觸擊數據庫的好方法。請注意,@peer建議的緩存也是一種選擇,但如果有很多併發用戶正在做類似這樣的事情,那麼您需要留意高內存使用情況,而且它對於長期情況也不理想(您會看到應用程序域回收)。 – eglasius

+0

也想想如果數據需要那麼大,即如果你只需要保留一些id的數據的一部分,而不是所有的細節。 – eglasius

0

是的,你可以做到。但視圖狀態會由於額外的開銷而減慢頁面加載速度。如果你的數據集很小,那麼可以,但是如果它的數據集大一些,那麼你可以查找其他的選擇

我怎麼會建議不要用這種方法[安全問題,慢等],而是設置一種方式,以便會話劑量過期,如果任何頁面打開?怎麼樣??使用jquery/ajax來定期維護與服務器的連接。

如果你想進一步實現sql會話。這將是最好的。

希望這些信息對您有所幫助。

+0

你會建議什麼?謝謝 –