2011-12-28 172 views
1

我有兩個自定義控件TestPanel和Header。兩者都是面板。 TestPanel還包含Header。 TestPanel和Header只包含一個字符串屬性Test。aspnet自定義控件在自定義控件中丟失viewstate

我只能把表頭上的標題。然後它運作良好。 我可以把TestPanel放在我的表單上,它顯示TestPanel + Header。然後它不能按預期工作,因爲Header的ViewState丟失了(或者Header.Test失去其價值的另一個原因)。 這裏是我的代碼:

public class TestPanel : System.Web.UI.WebControls.Panel 
{ 
    Header myHeader; 

    public string Test //Test is Header property; set/get header Test property 
    { 
     get 
     { 
      return this.MyHeader.Test; 
     } 
     set 
     {    
      this.MyHeader.Test = value; 
     } 
    } 

    public Header MyHeader 
    { 
     get 
     {     
      return myHeader; 
     } 
     set 
     {    
      myHeader = value; 
     } 
    }  

    public TestPanel() 
    { 

    } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(Test); 
     MyHeader.RenderControl(writer); 
    } 
} 

public class Header : System.Web.UI.WebControls.Panel 
{ 
    public string Test 
    { 
     get 
     { 
      string s = (string)ViewState[ID + "Test"]; 
      return (s == null) ? String.Empty : s; 
     } 
     set 
     { 
      ViewState[ID + "Test"] = value; 
     } 
    } 


    public Header() 
    { 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(Test); 
    } 

} 

在我的網頁我用:

1)如果只有パ我的形式(不回發後工作):

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     {   
      this.panel.Test = "paneltest"; 
     } 

    } 

protected void Unnamed2_Click(object sender, EventArgs e) 
    { 

    } 

2)如果只有我的網頁上的標題(這在回發後有效)

<my:MyHeader id="header" runat="server"></my:MyHeader > 
this.header.Test = "headertest" 

回答

0

當視圖狀態持續時對控制層次結構中的每個控件遞歸調用SaveViewState()。使用提供的代碼,Header不會被添加到TestPanel的Controls集合中,因此它不在控件層次結構中,因此Header的Test屬性的值將丟失。

有關視圖狀態如何保存和加載的更多詳細信息,請參閱Understanding ASP.NET View State