2017-02-16 101 views
0

我有一些在母版頁上設置的值,我想保存在回發中。然後,我希望這些變量在其加載事件期間可用於使用該母版頁的頁面。asp.net母版頁和視圖狀態

足夠容易在母版頁上創建屬性。所以我第一次嘗試說,在母版頁的加載事件期間,如果不是ispostback,那麼生成值並將它們保存到視圖狀態,否則從視圖狀態讀取它們。

除了......顯然常規頁面加載事件發生在主頁面加載事件之前,所以當我試圖讀取它時數據還沒有存在。

第二次嘗試:在Init事件期間讓主頁面設置或檢索這些值。沒有運氣。顯示視圖狀態未由Init時間填充。

據我所知,在視圖狀態填充之後但在主頁面的Load事件之前,母版頁上沒有事件發生。

我想每個頁面都可以有一個InitComplete或PreLoad來調用一個函數來填充這些字段,但這看起來很笨拙。電話必須在每一頁。即使該頁面從未使用過這些數據,它也必須位於每個頁面中,因爲主頁面使用這些數據來達到自己的目的。

有沒有辦法做到這一點?也許視圖狀態不是保存數據的正確位置?我可以將數據存儲在會話變量中,但之後不會回發,它們中的數據將從最後一次調用中遺留下來。我想我可以確保清除過時的數據,但這似乎很笨拙。

我在VB寫的,但我不認爲這會在這裏有所作爲。

+0

Hm ...如果您將這些數據存儲在主頁上的公共變量或屬性中,您可以通過添加一個'@ MasterType'指令來訪問它,這可以讓您執行類似'MyCompany.Text = Master.CompanyName'。 [更多信息](https://msdn.microsoft.com/en-us/library/xxwa0ff0.aspx)。雖然,我不確定這會落入主子頁面載入週期,也不會解決您必須修改每個子頁面的問題。 – Santi

+0

@santi是的,這正是我正在做的。問題是沒有從子頁面訪問母版頁變量,它在子項的Load事件之前獲取了母版頁變量。 – Jay

+0

哦,也許我應該澄清一下:是的,我希望每個子頁都必須說,foobar = master.foobar或任何它需要處理來自母版頁的值。每個子頁面都需要它自己的代碼來完成此操作。捕獲是在孩子的Load事件發生之前填充master.foobar。我希望孩子不必做任何事情來使人口發生,因爲母版頁也需要這些數據,我不希望主人依賴於孩子在正確的時間觸發人口。孩子應該依靠父母,而不是父母對子女。 – Jay

回答

0

您可以覆蓋母版頁LoadViewState方法以下列方式:

protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 

    // use the loaded values, if any, here 
} 

LoadViewState甚至頁面PreLoad之前加載之前,實際上被調用,這樣似乎適合你在找什麼。