[英]Simple question about how static variables work in ASP.NET?
我有一張顯示一些信息的地圖。 默認情況下,地圖上的標簽是關閉的。 有一個圖像按鈕,當您關閉標簽時,該按鈕具有關閉的圖像,而當您打開標簽時,其具有打開的圖像。 我的代碼可以正常工作,但是我想要一個更好的理由來說明為什么這種方式可以工作。 這是一段代碼。
如果我聲明一個類級別的布爾變量showLabels,如:
private bool showLabels = false;
然后具有以下代碼:
if(showLabels == false)
{
showLabels = true;
imgShowLabels.ImageUrl = "label-on.png";
}
else
{
showLabels = false;
imgShowLabels.ImageUrl = "label-off.png";
}
當我運行它時,地圖上會顯示默認情況下未顯示的標簽。 當我單擊“顯示標簽”按鈕時,變量showLabels變為true,並且圖像更改為label-on.png,但是當我再次單擊它時,showLabels變量被重置為false,因此什么也沒有發生。
所以我所做的就是將其更改為:
private bool showLabels = false;
至
private static bool showLabels = false;
它以這種方式工作。
這是處理這種情況的正確方法嗎?
在類級別,我將屬性放在:
public bool ShowLabels
{
get { return (bool)ViewState["ShowLabels"]; }
set { ViewState["ShowLabels"] = value; }
}
在if(!Page.IsPostBack)中,我將ShowLabels設置為false;
然后在我的if語句中,我正在做:
if(ShowLabels == false)
{
ShowLabels = true;
imgShowLabels.ImageUrl = "label-on.png";
}
else
{
ShowLabels = false;
imgShowLabels.ImageUrl = "label-off.png";
}
但是ShowLabels始終是錯誤的,我認為通過屬性ShowLabels設置ViewState可以保留其值。
請記住,每次執行回發(出於任何原因,包括僅用於處理服務器事件)時,您都在使用頁面類的全新實例 。 舊的頁面已經死了-一旦頁面最后一次呈現給瀏覽器,它就有資格一次性使用。
當您將其更改為靜態時,它將“起作用”,因為靜態變量與任何特定實例都沒有關聯。 但是,我懷疑在更廣泛的環境中開始測試時會感到驚訝。 由於該網站頁面的所有用戶都在同一個AppDomain中,因此他們都將設置相同的 showLabels變量。
要解決此問題,您需要將此變量存儲在僅對該用戶持久的位置。 選項包括ViewState,Session,數據庫或其他一些長期存儲機制。 我的偏愛傾向數據庫(也許使用帶有SQL Server的ASP.Net Personalization提供程序),因為用戶每次訪問您的站點時可能希望您記住這一點。
怎么樣:
ShowLabels = !ShowLabels;
imgShowLabels.ImageUrl = string.Format("label-{0}.png", (ShowLabels)?"on":"off");
Joel非常滿意,但我要補充一點,您可能應該做的就是將功能放到客戶端上,以確保不會意外清除您的靜態變量。
我會做類似的事情:
<a href="[YourPageHere.aspx]?showLabel=[togglethisvalue]>Show Labels</a>
對於Webforms。 然后,您可以將其作為查詢變量進行處理。 這樣,您就可以保證擁有正確的價值。 在客戶端有很多其他方法可以做到這一點。 為了簡化起見,我使用查詢變量方法,但是如果頁面變得更加健壯,則可能無法正常工作。
不確定ASP,但是作為一種樣式,
if(showLabels == false)
不太可讀。 你應該用
if(!showLabels)
代替
否,因為與所有Web應用程序一樣,這是一個多線程多用戶應用程序。 如果將變量設置為true,則實際上將為站點上的每個用戶打開標簽。
因為您說的是ASP.NET,所以您可能希望將其存儲在ViewState中。 您可以通過以下方式做到這一點:
ViewState["ShowLabels"] = false;
您可以將其包裝在屬性中。
public bool ShowLabels {
get { return (bool)ViewState["ShowLabels"]; }
set { ViewState["ShowLabels"] = value; }
}
希望這可以幫助。 ViewState的替代方法是SessionState,您可以對其使用相同的構造。
public bool ShowLabels {
get { return (bool)Session["ShowLabels"]; }
set { Session["ShowLabels"] = value; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.