自定义控件中的 aspnet 自定义控件丢失视图状态

发布于 2024-12-23 06:34:03 字数 1925 浏览 3 评论 0原文

我有两个自定义控件 TestPanel 和 Header。两者都是面板。 TestPanel 还包含标题。 TestPanel 和 Header 只包含一个字符串属性 Test。

我只能在表单上放置标题。然后效果很好。 我可以将 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"

I have two custom controls TestPanel and Header. Both are Panels.
TestPanel also contains Header.
TestPanel and Header contains only one string property Test.

I can put only Header on my form. Then it works well.
I can put TestPanel on my form and it shows TestPanel+Header. Then it doesn't work as expected, because ViewState of Header is lost (or there is another reason why Header.Test looses its value).
Here is my code:

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);
    }

}

On my page I use:

1) If only TestPanel on my form (this doesn't work after postback):

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

    }

protected void Unnamed2_Click(object sender, EventArgs e)
    {

    }

2) If only Header on my page (this works after postback)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尘世孤行 2024-12-30 06:34:03

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

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

When view state is being persisted SaveViewState() is being called recursively for each Control in the control hierarchy. With the code provided the Header isn't being added to the Controls collection of the TestPanel and as such it isn't in the control hierarchy so the value of the Test property of the Header is lost.

For more details on how view state is saved and loaded, read Understanding ASP.NET View State.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文