2013-04-23 63 views
0

我想解決一個真正的蹩腳的ASP.net 4.0程序交給我。編寫它的人沒有使用正常的asp.net標準。我自己對ASP.net相當陌生,並且儘可能多地瞭解它。在任何情況下,它都是一個ASP.Net 4.0 webforms應用程序,後面帶有C#代碼。如何在代碼後面的所有方法之間共享變量?

我正在處理一個頁面,它有一個調用標記本身後面的代碼的方法。我們可以調用這個方法get detailById。此方法調用Web服務,該服務使用此ID查詢數據庫,並將數據集返回到後面的代碼。一旦收到所有這些數據,它就會被寫入屏幕的表格中。這就是這種方法。在這個頁面的底部有各種不同的功能按鈕。例如,讓我們拿一個叫做Hello的按鈕。所有這個按鈕所要做的就是訪問在detailById方法中獲得的字段之一(例如:用戶名)。 我該如何使這個變量值可用於方法後面的所有代碼?我認爲以下的想法:

  1. 重新查詢數據庫一樣detailById實現該領域,但這似乎非常低效的。

  2. 爲頁面創建一個類級別的變量,並將它的值設置爲detailById方法中的用戶名變量。這沒有用。當我點擊「你好」按鈕時,用戶名缺失。我知道它是在detialById方法中獲得的。

  3. 然後,我認爲回發可能是值消失的責任,所以我將用戶名值存儲在一個ViewState變量中,而在detailById方法中。當我試圖訪問這個變量時,它也是空的。我不知道爲什麼。

  4. 最後,我把這個值放在Session中,而在detailById方法中。這工作,價值能夠在我的各種代碼背後的方法引用。這感覺像是一個錯誤的方式來做到這一點。我對嗎?

什麼是好的/正確的方法來做到這一點?

我希望我明確提出了我的問題。謝謝。

回答

0

我建議把它放在ViewState(#3)。但是,您必須確保@Page標記上有EnableViewState=TrueViewStateMode=Enabled(實際上這些是默認設置)。我更喜歡用一個屬性喜歡用一個屬性來包裝存儲/檢索工作:

private string UserName 
{ 
    get 
    { 
     return ViewState["__userId"] as string; 
    } 

    set 
    { 
     ViewState["__userId"] = value; 
    } 
} 

更重要的是,你將不得不調用getDetailById方法從Page_Load。因爲在渲染階段調用了aspx頁面上的嵌入代碼,之前已經保存了ViewStatecheck here)。如果不可能將該代碼移動到Page_Load中,則需要Session(#4)來完成該工作。

+0

您的意見是非常有幫助的,並在商標上。在你提到它之前,我不知道這些信息。我使用會話將其存儲在我正在修復的版本中。最近我重寫了它,並且一旦將代碼移動到Page_load事件中,就能正確使用Viewstate。謝謝! – user1911835 2013-07-17 04:30:20