2009-11-18 53 views
1

我寫了一個ASPX c#頁面,我必須使用這樣的全局變量;ASPX中的全局變量C#

public static Decimal _Total; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Page.IsPostBack == false) 
     { 
      _Total=0; 
     } 
    } 

public void ShowCekBanka() 
    { 
     _Total= 10 * 5; 
    } 

public void ShowNakitBanka() 
{ 
     _Total= 10 * 10; 
} 

現在;我把2個按鈕放在頁面中; Button1運行ShowCekBanak()函數; Button2運行ShowNakitBanka()函數;

當我第一次運行項目時,我點擊Button1和_Total = 50就可以了; 但我在另一個Internet Explorer中打開我的項目我看到_Total值在新打開的頁面中爲50。所以問題是全球變量_Total是太多全球:) 兩個互聯網資源管理器頁面顯示在_Total中的SAME值都_Totals是50; 它必須是這樣的; First Page _Total是50 OK,但是新的IE頁面必須是_Total是0; 不是嗎?

那麼我該如何解決這個問題? 謝謝;

回答

2

公共靜態變量的行爲就像這樣。如果你想要的是保持_Total的頁面的回發過程中的價值,考慮以下

public decimal _Total { 
    get { return (decimal) ViewState["_total"]; } 
    set { ViewState["_total"] = decimal; } 
} 
+0

好吧,我喜歡這個,但現在;當我點擊按鈕_Total現在是0;每頁 – atromgame

+1

但是請注意,'ViewState'存儲在HTML頁面中(以編碼形式),因此熟練的用戶/黑客可以在回發期間更改此值。這*可能*是安全問題,具體取決於應用程序的確切類型。 – Heinzi

+0

+1這是一個有效的點。做完全相同的事情,但將'ViewState'改爲'Session'是解決這個問題的方法,但取決於你打開一個新窗口的方式,這可能與這個項目的原始問題有關。 –

3

靜態變量是全球應用程序。在asp.net中,只有一個應用程序實例,它由Web服務器和所有用戶瀏覽器共享運行。作爲d。提到維護狀態的方法有多種,如果這是你所追求的,其中之一是視圖狀態,其他選項是隱藏字段和頁面上下文對象。

Article (albeit a bit old) on asp.net state

Sohnee的答案是在asp.net編程太常見的誤解,並導致一些噩夢調試。基本上,你一直在開發你的應用程序,它會爲你工作得很好。然後,當您獲得合理數量的訪問者(即一旦上線),您會發現客戶或測試人員報告的內容非常不準確並且結果不一致。頁面上的靜態變量對於該頁面的所有實例都是全局的 - 這意味着訪問該頁面的所有瀏覽器。我修改了他的示例以添加一些睡眠,以便我們可以模擬在活動服務器上可能發生的情況(即滯後)。

public partial class _Default : System.Web.UI.Page 
{ 
    public static Decimal _Total; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Page.IsPostBack == false) 
     { 
      _Total = 0; 
      TextBox1.Text = _Total.ToString(); 
     } 
    } 

    public void ShowCekBanka(object sender, EventArgs e) 
    { 
     _Total = 10 * 5; 
     System.Threading.Thread.Sleep(5000); 
     TextBox1.Text = _Total.ToString(); 
    } 

    public void ShowNakitBanka(object sender, EventArgs e) 
    { 
     _Total = 10 * 10; 
     System.Threading.Thread.Sleep(5000); 
     TextBox1.Text = _Total.ToString(); 
    } 

} 

如果你現在打開兩個瀏覽器窗口,然後打在一個屏幕一個按鈕,然後在其他屏幕中的其他按鈕,等待幾秒鐘,你會看到,無論是在報告的文本框中相同的結果。很難解釋......但希望有所幫助。

0

如果按CTRL + N以獲得新窗口,則會看到此行爲。如果您從全新的窗口打開一個全新的窗口,請轉到該網址,您不應該看到這個。

我幾乎精確地測試了你的代碼,它並沒有在兩個完全獨立的瀏覽器窗口之間保留_Total的值。這是你的代碼,稍作調整。

public static Decimal _Total; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack == false) 
    { 
     _Total = 0; 
     TextBox1.Text = _Total.ToString(); 
    } 
} 

public void ShowCekBanka(object sender, EventArgs e) 
{ 
    _Total = 10 * 5; 
    TextBox1.Text = _Total.ToString(); 
} 

public void ShowNakitBanka(object sender, EventArgs e) 
{ 
    _Total = 10 * 10; 
    TextBox1.Text = _Total.ToString(); 
} 

我跑的頁面並點擊一個按鈕,一共拿到了0以外,然後打開一個新的瀏覽器,並總爲0

我然後跑的頁面並點擊一個按鈕,得到總數不爲0,然後按CTRL + N,然後總數爲「預填充」。即使如此,我認爲你對「靜態」的使用是一個「VB主題」 - 嘗試沒有,我想你會好起來的。