2011-03-30 46 views
17

我在嘗試清理一個ViewState處處啓用的ASP.NET WebForms站點。這是一個性能問題 - 巨大的視圖狀態導致明顯的提交延遲。但大多數表單並不需要ViewState,除了一些複雜的控件&表單數據。即使是沒有輸入控件的表單,也會產生很大的視圖狀態,因爲我猜asp.net正在存儲關於每一個服務器控件的各種元數據。但能見度狀態等都是在代碼中控制的,所以我認爲我可以消除很多。在asp.net 4.0中儘量減少ViewState-被EnableViewState和ViewStateMode困惑

EnableViewState="false"添加到每一個不需要它的控件(在一個頁面中,並在代碼中創建)是非常繁重的,所以我試圖在頁面/控件級別禁用它,並選擇性地啓用它需要它的東西。 (是的,我意識到這是有風險的,但實際上只有幾個大表單和一對模板,如果解決的話會產生很大的差異)。

這是我沒有得到的。

如果一個控件或頁面有EnableViewState="false"它的<%.. %>描述符,或者在它的標籤中它在父頁面中創建的地方,所有事情都會中斷,因爲在代碼中添加的任何ViewState數據都不起作用。所以我似乎可以在控制級別保持啓用狀態,但在每個容器中將EnableViewState設置爲false,然後在每個控件級別設置ViewStateMode=true(哪個是ovvrides)。

什麼我沒有變是發生了什麼時:

ViewStateMode = ViewStateMode.EnabledEnableViewState = false爲包含其他控件的控制。

用於控制。內部控件是否仍然可以使用ViewStateMode?基本上,當它們發生衝突時,哪個設置有最後一個詞?

對於每個容器,我希望能夠在一個包裝控制禁用一切,但仍然保證:

1)代碼工作 ViewState的設置,

2)的ViewState被禁用默認爲所有控件

3)我可以有選擇地啓用ViewState的子控件。

這似乎是混淆。如果在母版頁中有一個包裝控件設置爲EnableViewState="false",但是將子控件設置爲ViewStateMode="Enabled",它會中斷。根據MS,ViewStateMode應該取代任何外部ViewState設置,但它似乎不工作。

+1

如果您提供一個關鍵信息,此問題非常容易回答:哪個版本的ASP.NET? – 2011-03-30 12:13:08

+0

對不起! Asp.net 4.0。 – 2011-03-30 12:30:03

回答

14

根據MSDN article on ViewStateMode,ViewStateMode僅當EnableViewState="true"時纔有意義。爲了達到您想要的效果,您必須在控件上留下ViewStateMode="Enabled",然後將主控件的子控件包含在asp:Placeholder中,該控件具有ViewStateMode="Disabled"。這樣,您仍然可以在代碼隱藏中操作ViewState,但是沒有任何子控件會擁有ViewState(除了您明確設置的通過ViewStateMode="Enabled")。

+0

謝謝。在弄明白之後,我已經弄明白了這一點,並且基本上爲每個控件/頁面設置了'ViewStateMode =「Enabled」',爲包裝器設置'Disabled',並且爲特定控件再次設置'Enabled'。似乎工作到目前爲止沒有太多驚喜,並且ViewState垃圾數量明顯減少.. – 2011-04-05 17:21:27