簡體   English   中英

關於靜態變量在ASP.NET中如何工作的簡單問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM