aspnet customcontrol в customcontrol теряет состояние представления - PullRequest
1 голос
/ 28 декабря 2011

У меня есть два пользовательских элемента управления TestPanel и Header. Оба являются панелями. TestPanel также содержит заголовок. TestPanel и Header содержат только одно строковое свойство Test.

Я могу указать только заголовок в моей форме. Тогда это работает хорошо. Я могу поместить TestPanel в мою форму, и он показывает TestPanel + Header. Тогда он не работает должным образом, потому что ViewState из Header потерян (или есть другая причина, по которой 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"

1 Ответ

0 голосов
/ 07 июля 2012

Когда состояние просмотра сохраняется, SaveViewState () вызывается рекурсивно для каждого элемента управления в иерархии элементов управления. С предоставленным кодом Заголовок не добавляется в коллекцию Controls TestPanel и, как таковой, он не входит в иерархию элементов управления, поэтому значение свойства Test Заголовка теряется.

Подробнее о сохранении и загрузке состояния просмотра читайте в Общие сведения о состоянии просмотра ASP.NET .

...