customcontrol中的aspnet customcontrol丢失了viewstate

时间:2011-12-28 08:56:17

标签: asp.net viewstate

我有两个自定义控件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)如果我的页面上只有Header(这在回发后有效)

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

1 个答案:

答案 0 :(得分:0)

当持久化视图状态时,对于控件层次结构中的每个Control,将递归调用SaveViewState()。使用提供的代码,Header不会被添加到TestPanel的Controls集合中,因此它不在控件层次结构中,因此Header的Test属性的值将丢失。

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