自定义控件中的asp.net自定义控件失去了视图状态



我有两个自定义控件TestPanel和Header。两者都是小组。TestPanel也包含Header。TestPanel和Header只包含一个字符串属性Test.

我只能在表单上添加Header。然后它工作得很好。我可以把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)如果只有TestPanel在我的表单(这不工作后发回):

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"

当viewstate被持久化时,对控件层次结构中的每个控件递归地调用SaveViewState()。通过提供的代码,Header没有被添加到TestPanel的Controls集合中,因此它不在控件层次结构中,因此Header的Test属性的值丢失了。

有关如何保存和加载viewstate的更多详细信息,请阅读Understanding ASP。. NET View State.

最新更新