關於Asp.net 頁面動態載入使用者控制項,出現“未能載入檢視狀態”的原因

來源:互聯網
上載者:User

我定義了兩個使用者控制項。

Definition1 =(Definition) Page.LoadControl("ModuleControl/Definition.ascx");
                    
RightDefine1 = (RightDefine) Page.LoadControl("RightControl/RightDefine.ascx");

根據頁面的radio選擇不同的使用者控制項載入,
private void Page_Load(object sender, System.EventArgs e)
        {

            
//            Response.Write(ModuleType.ToString()+"select<br>");
//            Response.Write(ViewType_txt.Text+"select<br>");
//            
            if(ModuleType.ToString()!=ViewType_txt.Text)
            {
                
                WebPart.EnableViewState = false;
                ViewType_txt.Text = ModuleType.ToString();
//                
//                _pageModule = Request.QueryString["PageModule"];
//                if(_pageModule!="")
//                    Response.Redirect(Request.Url+"?PageModule="+((int)ModuleDetail).ToString());
                
               
            }
            
            

            WebPart.Controls.Clear();
            switch(ModuleType)
            {
                case (int)LoadContent.ModuleDetail:
                    
                    
                    Definition1 =(Definition) Page.LoadControl("ModuleControl/Definition.ascx");
                    

                    
                    Definition1.PostShowCatalog +=new AuthorWeb.Web.ModuleControl.Definition.ShowCatalogEventHandler(Definition1_PostShowCatalog);
                    ModuleCatalog1.SelectedCatalog +=new AuthorWeb.Web.ModuleControl.ModuleCatalog.SelectCatalogEventHandler(ModuleCatalog1_SelectedCatalog);

                    Definition1.ID = "ID_Define";
                    WebPart.Controls.Add(Definition1);
                    
                

                    

//                    Response.Write("add define control<br>");
                    


                    break;
                case (int)LoadContent.ModuleRightDetail:


                                    
                    
                    RightDefine1 = (RightDefine) Page.LoadControl("RightControl/RightDefine.ascx");
                    RightDefine1.ID = "ID_RightDefine";

                    WebPart.Controls.Add(RightDefine1);
                    ModuleCatalog1.SelectedCatalog +=new AuthorWeb.Web.ModuleControl.ModuleCatalog.SelectCatalogEventHandler(ModuleCatalog1_SelectedCatalog_byRight);
                    
                
                



                


                    break;

            }
}

使用者在幾次使用中都會遇見:
未能載入檢視狀態。正在向其中載入檢視狀態的控制項樹必須與前一請求期間用於儲存檢視狀態的控制項樹相匹配。例如,當以動態方式添加控制項時,在回傳期間添加的控制項必須與在初始請求期間添加的控制項的類型和位置相匹配。

關於這個問題的討論有:
http://www.cnblogs.com/airforce1st/archive/2004/08/27/36973.aspx
http://blog.joycode.com/ghj/archive/2004/04/16/19768.aspx

這個問題的出現,我認為就是ViewState造成的。

在回傳時候,使用者試圖去載入第二個控制項的時候,由於第一控制項仍有ViewState存在,服務端會嘗試去恢複已經不存在的使用者控制項的狀態(或事件),結果,出現這種問題。

我作了一些嘗試:

比如在載入不同的使用者控制項的時候,將PlaceHolder的EnableViewState = false;
給使用者控制項加上定義的id:

     Definition1.ID = "ID_Define";
     WebPart.Controls.Add(Definition1);
但是,啟動並執行時候還是有問題。

最後實在沒有辦法,在同事ben的協助下,加了一行代碼,解決了問題。
我們一致認為這個是微軟的bug
這行代碼是什麼呢??

WebPart.Controls.Add(new Label());//it is
     WebPart.Controls.Add(RightDefine1);

本文續:
http://www.cnblogs.com/king_astar/archive/2005/06/01/165763.html

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.