2014-10-29 41 views
0

我正在開發一個asp.net應用程序。我有一個名爲「home.aspx」的頁面,其中包含2個名爲「button1」和「button2」的按鈕。每個按鈕都有一個onclick方法,分別稱爲「Button1_click」和「Button2_click」。我的目標是分享這2種方法之間的公共變量,所以基本上我試圖將屬性添加到這樣的關聯到我的網頁類:在asp.net應用程序中共享一個全局變量到一個類

public partial class Home : Syste.Web.UI.Page 
{ 
    private int myproperty=0; 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     myproperty++; 
    } 

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     myproperty++; 
    } 
} 

有了這個代碼,我想的是,「私人詮釋myproperty = 0「只會在我第一次加載並進入頁面時調用。然後當我在頁面上時,如果我點擊button1或button2,myproperty只會增加一個。但是當我調試時,我發現每次單擊button1或button2時,都會再次調用「private int myproperty = 0」,這是我不明白的。有沒有人有解決方案?

在此先感謝您的幫助。

+0

像'Page'這樣的asp.net類只存在於請求的生存期內,每個請求都會創建一個新的實例。如果你想在請求之間存儲信息,你必須將它存儲在某個地方,如果它只在內存中,那麼經常使用'Session',但要記住每個客戶端都有自己的會話。 – 2014-10-29 11:11:01

回答

0

讓你變static

像這樣

public partial class Home : Syste.Web.UI.Page 
    { 
    private Static int myproperty; 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     //You can access myproperty here (same copy) 
    } 

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     //You can access myproperty here (same copy) 
    } 
} 
+0

什麼?那麼ASP.NET中'Session'的需求是什麼? – Rahul 2014-10-29 11:25:28

+0

會話對象適用於用戶會話級別,應用程序對象適用於所有用戶或整個應用程序,並且這適用於特定的頁面級別。它將共享相同的數據副本。 – yogi970 2014-10-29 11:31:02

+0

不,這是一種錯誤的做法。您應該使用任何狀態維護機制,而不是將其存儲在'static'變量中。考慮閱讀更多關於這個。 – Rahul 2014-10-29 11:32:58

1

在ASP.NET,如果你想使用全局變量,你必須使用Session對象(如果變量是不同的對於每個單個用戶,例如計算用戶點擊某個按鈕的次數)或Application對象(如果該變量對於所有用戶都很常見,例如計算用戶訪問您的網站的次數)。 例子:

//Set variable 
Session["myVariable"] = value 
//Get variable 
var myVariable = Session["myVariable"] 

的語法是相等Application只是Application

0

您可以使用會話如下

private int Count 
{ 
    get 
    { 
    if (Session["Count"] == null) 
    {   Session["Count"] = 0; return 0;  } 
    else 
     return (int)Session["Count"] ; 
    } 
    set 
    { 
     Session["Count"] = value; 
    } 
} 

protected void Page_Load(object sender, EventArgs e)  
{ 
    if(!IsPostBack) 
     Count = 0; 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Count++; 
} 

protected void Button2_Click(object sender, EventArgs e) 
{ 
    Count++; 
} 
0

你怎麼想分享的變量myProperty的價值取代Session

- 如果你想重用的myproperty每個窗口的值,你需要存儲在vewstate值:http://msdn.microsoft.com/en-us/library/ms227551%28v=vs.85%29.aspx

另一種方法是使用asp.net三夏hiddenfiled存儲值。

- 如果你想重新使用會話值,可以將該值在會話存儲(會話[「myProperty的」])

- 如果你想與所有可以使用的用戶共享價值應用程序:http://msdn.microsoft.com/en-us/library/94xkskdf%28v=vs.100%29.aspx

0

正如Ben Robinson所說,你必須堅持這個價值。 一個簡單的方法是使用會話:

  1. 在類中創建一個「常量字符串」變量來保存,如會話指數:

    常量字符串MY_PROPERTY =「myProperty的」;

  2. 然後每當要存儲或讀出的值使用:

    //存儲 會話[Home.MY_PROPERTY] = int.parse(會話[Home.MY_PROPERTY])+ 1; //讀取 INT MYVARIABLE = int.parse(會話[Home.MY_PROPERTY])

你也可以創建你的類像一個屬性:

const string MY_PROPERTY = "MyProperty"; 
public int MyProperty 
{ 
    get 
    { 
     if (Session[Home.MY_PROPERTY] == null) 
     { 
      return 0; 
     } 
     else 
     { 
      int iValue = 0; 
      if (int.TryParse(Session[Home.MY_PROPERTY].ToString(), out iValue)) 
       return iValue; 
      else 
       return 0; 
     } 
    } 
    set 
    { 
     Session[Home.MY_PROPERTY] = value; 
    } 
} 
0

只有回發檢查,在增量之前,可以解決問題。 增量前添加以下代碼。

if(!IsPostBack) 
相關問題