2012-10-09 37 views
2

我想擁有一個在兩種不同方法之間共享的對象數組。在不同事件中訪問相同的對象

我的網頁上button1的onclick調用方法1,該方法填充objectArray的所需值。我需要button2的onclick方法能夠使用method1正在處理的相同數據訪問同一個objectArray。

using myWebReference; 
{ 
public partial class _Default : System.Web.UI.Page 
{   
    ObjectArray[] myObjects = new ObjectArray[100]; 

    public void Page_Load(object sender, EventArgs e) 
    { 
     //I have nothing in here at the moment  
    } 
    public void method1(object sender, EventArgs e) 
    { 
     //myObjects[]'s values are calculated and assigned here. 
    } 
    public void method2(object sender, EventArgs e) 
    { 
     String key = myObjects[0].value; 
     //when I try to get data within myObjects here, myObjects does exist, 
    //but it is empty and I get a null reference error when I try to use its values. 
    } 
}  
+2

我建議閱讀一些關於asp.net和web的樣本和書籍,一般來說...這裏你有你的頁面類將在每個請求上重新創建,因此myObjects將是空的。每個按鈕點擊都是一個新的請求。您需要將myObjects保存到某個存儲(並在pageLoad或類似事件中恢復),或者將其發送給客戶端,然後在單擊button2時發回服務器。 – Felix

回答

1

正如@ Peter Repac說,你也可以使用ViewState。就像這樣:

//In method1. 
ViewState["MyObjectsKey"] = myObjects; 
.... 

//In method2. 
myObjects = ViewState["MyObjectsKey"]; 

警惕使用這個如果myObjects變得相當大,因爲ViewState是與頁面送出,所以腹脹它的大小可能會影響性能。有關ViewState here的更多信息

+0

它可以存儲在每次回發中保存和檢索的會話中,從而對性能造成的影響較小。 –

+0

的確如此,但如果會話是InProc並且應用程序池被回收,數據可能會丟失。 –

+0

是的,那也是如此。 Viewstate會丟失,其他會話數據也會丟失。可能導致自動用戶註銷,在該階段,丟失的視圖狀態數據將是小問題。 –

0

如果你想在不同的回發提供的數據,你要麼需要加載數據以同樣的方式對每一個回傳,或可能存儲在會話狀態的數據(或其他一些可以接受的地方),一旦它第一次加載。

您可以閱讀會話狀態here。請務必閱讀使用會話狀態的潛在隱患。

你的代碼,最終可能看起來像這樣:

myObjects = LoadMyObjects(); 
Session["objects"] = myObjects; 
3

這不是語言的問題。它綁定到web表單。 每個Web請求完成後,Web服務器上的所有狀態都將被銷燬。

因此: 在Web請求1上,您調用method1並且您的數組已填充。

web請求1完成的html被返回給瀏覽器,服務器上的數組被銷燬。

在web請求2方法2是所謂的,但陣列僅由線

ObjectArray[] myObjects = new ObjectArray[100]; 

所以沒有其它數據是在它初始化。

如果你希望能夠達到「以前的」 myObjects珍惜你應該保存在某個地方吧,比如在SessionState的安倍晉三作爲建議,在DB,在視圖狀態中,在餅乾,....

+0

我不知道這是發生了什麼。謝謝。 – Krondorian

0

最簡單的方法是創建一個加載數組的方法,並在按下按鈕1時調用它,並在按下按鈕2時調用它。但在行動2你會稍後做更多的東西...

如果你剛開始我不認爲是一個好主意,開始搞亂viewstate或會議,因爲他們可以創造一些壞習慣。恕我直言,最簡單的方法是加載陣列兩次。

您甚至可以從method2調用method1而不創建其他方法。

+1

它實際上是相對的。數組的創建可能是一個性能殺手,因此創建一次並堅持它會好得多。但是,情況並非一定如此。我只是提出一個有效的觀點。 –

+0

我知道,但我曾與一些asp.net初學者一起工作,最糟糕的是你可以教他們的是會議,直到他們做好準備。 :-) – H27studio

+0

絕對同意。我見過這種概念被初學者濫用,因爲在大多數情況下,他們並不完全理解每個概念的全部用途以及何時使用每個概念。然而,經驗是他們可能擁有的最好的老師。 –

相關問題