我經常在我們的ASP.NET頁面將不得不數據顯示,到上一個GridView用戶的情況下,讓他改變他自己高興(單元格上的文本框),並且只有在實際點擊「保存按鈕」時纔將其保存到數據庫中。這些數據通常是頁面信息的虛擬狀態,這意味着用戶可以在沒有真正保存的情況下更改所有內容,直到他點擊「保存按鈕」。 在這些情況下,始終存在需要在ASP.NET Postback中持久保存的數據列表。這些數據可能是DataTable
的一個實例,或者只是一些List<Someclass>
。
我經常看到有人執行此操作並堅持數據Session
。在這種情況下,當涉及到某些用戶在多個選項卡打開的情況下導航時,我通常也會遇到問題,有時會在同一頁面上打開。兩個不同選項卡的數據將被合併並導致信息被混亂的問題。
如何會議經常被用來舉例:
private List<SomeClass> DataList
{
get
{
return Session["SomeKey"] as List<SomeClass>;
}
set
{
Session["SomeKey"] = value;
}
}
人們常常試圖通過做這樣的事情來解決這個問題:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList = null
}
else
{
FillGridView(DataList);
}
}
但怎麼樣時,兩個標籤已經加載,並且用戶是否正在改變GridView的值,並且出於某種奇怪的原因,他試圖通過點擊另一頁上的Save按鈕來保存數據?我個人不喜歡這個選項。
其他方法可以將數據放在ViewState
上。但是,當涉及到大量保存大型列表時,當它存儲在頁面上時(HiddenField
),可能會對頁面造成嚴重影響。
但是,做這項工作的最佳方法是什麼?有一次,我認爲在使用Session
和ViewState
時,ViewState
將包含一個唯一標識符,它將索引Session
保存的數據。這將防止在瀏覽器標籤之間共享數據:
private List<SomeClass> DataList
{
get
{
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
return Session[ViewState["SomeKey"].ToString()] as List<SomeClass>;
}
set {
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
Session[ViewState["SomeKey"].ToString()] = value;
}
}
在另一方面,將新的數據列表中的每個用戶進入該頁面時存儲會話。這會影響服務器內存。也許他們可能以某種方式被抹去。
問:
什麼是堅持那種跨回傳數據,考慮對瀏覽器多標籤的上下文的最好的方式,對服務器和維護編碼隊更低的成本?
更新:
由於@nunespascal很好地貼出來,其中一個方案是存儲在Session
的ViewState
使用SessionPageStatePersister
。但不幸的是,這不是我的情況。但它與我的最後一個例子並沒有太大的不同,它將數據保存在由存儲在ViewState上的UniqueId索引的會話中。
會有其他選擇嗎?
第二種方法是可行的一些調整:1)使用隱藏的字段,而不是ViewState。這使您可以在ViewState在頁面上可用之前訪問它(有時很有用)。 2)與管理人員進行會話,限制一次可以存儲多少物品並拋出最舊的物品。當然,這並不能完全解決內存問題,但可以讓用戶在應用程序中有機地工作而不用擔心繁忙的用戶在內存中會有數百個大對象/集合。 – 2013-04-24 22:02:24