2014-09-18 116 views
0

我知道這個問題很簡單。我一直在網上開發(特別是ASP.net)中圍繞變量進行搜索,但我想我只是不知道從哪裏開始學習過程。Asp.net中變量的持久性

從桌面應用程序開發的到來,我知道一個變量,只要它是在正確的範圍界定將持續,直到它不再需要(應用程序關閉,方法完成執行等)。但是,在ASP.NET中,變量會發生什麼?

例如,假設用戶A導航到一個web形式,其背後的代碼看起來像:

protected void Page_Load(object sender, EventArgs e) { 
int a = 1; 
} 

當是 「一個」 不能再訪問?如果用戶發佈表單,我是否仍然可以使用「a」知道它將從最後一次頁面加載持續? 如果是,直到何時「a」持續? 如果不是,我該如何堅持下去?

我相信有很多閱讀有關此主題的哪裏開始呢?

在此先感謝。

回答

1

它會繼續下去,直到Page_Load中完成很像一個函數聲明的任何其他正常的變量。

如果你想要一個變量,它會在任何時間訪問而頁面打開,你會想申報以外的任何職能,Page類的起點附近。

protected int a = 1 

protected void Page_Load(object sender, EventArgs e) { 
    int b = a //b now equals 1 
    a = 2; //a now equals 2 and will be referenced as so in any other function. 
} 

現在,如果刷新頁面,它將被重置爲1,然後再次設置爲2。如果您正在使用用戶輸入來更改a的值,那麼當用戶操作需要更改其值時,您需要在會話中存儲a

例子:

protected function UserClicksAButton() 
{ 
    a = Convert.ToInt32(SomeTextBox.Text); 
    Session["A"] = a; 
} 

然後在頁面加載,你可以檢查,看看是否會話[「A」]爲空,如果不是則設置a = (int)Session["A"];

或者你可以使用全局變量,是可用的站點範圍:您可以在以下網址找到更多有關全局變量的信息:http://www.dotnetperls.com/global-variables-aspnet

+0

嗨,非常感謝。好的,如果我在外面宣佈它,直到它何時可以訪問?直到用戶導航到另一個頁面或直到他完全離開服務器?另外,如果我在那裏聲明它,變量是否可以被其他用戶訪問?或者每個用戶都有自己的變量? – bob 2014-09-18 17:54:26

+0

既不是,它只能在自己的頁面中訪問。如果你想從另一個頁面訪問A,你可以存儲在它的會話中(請參閱我的更新答案)或使用全局變量:http://www.dotnetperls.com/global-variables-aspnet – 2014-09-18 17:57:14

+0

也@bob每個用戶都有他們的自己的變量,它們不會在用戶之間共享 - 這會導致各種問題! ;) – 2014-09-18 17:58:54

1

它的工作原理與任何應用程序幾乎相同,請記住,代碼和頁面都編譯爲一個類,然後執行。

唯一的例外是,如果你定義靜態變量,在這種情況下,他們將生活,直到應用程序域回收,它可以爲許多這樣做的原因,這是不是你應該依靠。

如果需要你可以使用內置的Session和Application對象來存儲值請求之間持續存在的值。

1

從桌面應用程序開發即將...

ASP.NET是沒有什麼不同。你仍然在使用方法,類,對象等。

protected void Page_Load(object sender, EventArgs e) { 
    int a = 1; 
} 

當是 「一個」 不能再訪問?

您處於方法的範圍內。當控制流程退出該方法時,a將超出範圍。這是完全一樣的桌面應用程序。

如果a是一個類級別的成員值,那麼只要該對象實例在內存中,它就會保留在內存中。如果它是一個靜態值,那麼只要該靜態上下文被加載,它就會保留在內存中。等等。

有一件事對於初學ASP.NET的人來說(你可能有打算要問),往往令人驚訝的是Page對象不會在請求之間留在內存中。因此,如果您在加載頁面時設置了類級別的值,則下一次請求進入該頁面時(例如單擊按鈕以調用回發),該值已丟失。如果你仔細想想,爲什麼會這樣呢?想象一下,如果所有需要的頁面長時間停留在內存中,則對於任何重要系統的內存要求都是如此。

相反,Web請求本質上是無狀態的。對象維護狀態,所以無狀態系統不會維護對象。所以如果你想跨多個請求保留一個值,那麼你需要將它保存在對象以外的地方。你有很多的地方堅持國家選擇:

  • 頁值
  • 餅乾
  • 會議
  • 靜態值
  • 數據庫(或其他外部持久性)

所有這些都有其優點和缺點,並且它們在不同情況下都有自己的使用壽命和可靠性,因此開發人員需要確定哪個狀態持久性介質對於持續狀態的特定元素是最重要的。

+0

不要忘記ViewState。 – Tim 2014-09-18 17:59:10

+1

@Tim:這是我名單上的第一個... – David 2014-09-18 18:01:15