Asp.net

無法載入視圖狀態。正在載入視圖狀態的控制樹必須與用於保存視圖狀態的控制樹匹配

  • August 27, 2017

我目前正在為幾個 web 項目開發一個動態核心。它有一個使用樹視圖和菜單的核心。然後對於每個特定的項目,它將幾個不同的 wuc 載入到一個主要內容中。一些商業項目使用與商業相關的 wuc,而另一些則使用不同的 wuc。所以wuc的跨度真的很大。

現在我的問題是,每當使用者按下菜單項或樹項時,它都會將 wuc 載入到連結到該對象的 maincontent 中。

但是我遇到了一些視圖狀態錯誤,我已經環顧四周 2 天了,解釋的解決方案都不適用於我的項目。

我所有的 wuc 都必須啟用視圖狀態。

循環是->

Page(Control A) 使用變數回發以將控制更改為 wucPanel(UpdatePanel) 中的 ControlB。OnLoad LoadRequested Wuc。

目前程式碼是

protected void Load_Page(object sender, EventArgs e)
{
//Code to decide which wuc to load.
UserControl wucc = (UserControl)Page.LoadControl(sFilePath);        
ParentControl.ContentTemplateContainer.Controls.Add(wucc);
}

我已經嘗試了幾個修復,比如向 wuc 添加不同的 id,但這要麼會禁用處理程序等控制的內部功能,要麼會生成相同的視圖狀態錯誤。

我發現的一種解決方案是載入 ControlA,然後將其刪除,然後載入 ControlB。但這禁用了我的第 3 方控制器 (Telerik) 的腳本。

我也讀過關於每個typof 有不同的PlaceHolders 但是因為我希望有多達50 個不同的控制項,所以我覺得這對我沒有幫助。

從 Page_Load -> Page_Init 移動會產生同樣的錯誤。

錯誤:

無法載入視圖狀態。正在載入視圖狀態的控制樹必須與在先前請求期間用於保存視圖狀態的控制樹匹配。例如,當動態添加控制項時,回發期間添加的控制項必須與初始請求期間添加的控制項的類型和位置相匹配。

在您的情況下 Anders,您仍然需要在 init 方法中將舊控制項與您現在要添加的新控制項一起添加到您的頁面。保留對您剛剛添加到類級別變數中的舊控制項的引用。所以像

   Control _oldControl = null;
   protected void Init_Page(object sender, EventArgs e)
   {
   //Code to decide which wuc to load.
    UserControl wucc = (UserControl)Page.LoadControl(sFilePath);        
    ParentControl.ContentTemplateContainer.Controls.Add(wucc);
    _oldControl = wucc as Control;
   //Now add the new control here.
   }

  //override the LoadViewState method and remove the control from the control's collection     once you page's viewstate has been loaded 
   protected override void LoadViewState(object savedState)
   {
           base.LoadViewState(savedState);
           ParentControl.ContentTemplateContainer.Controls.Remove(_oldControl);
   }

希望這可以幫助。如果是這樣,請選中此答案旁邊的複選框以接受它,如果您願意,請投票:)

引用自:https://stackoverflow.com/questions/5165384