代码之家  ›  专栏  ›  技术社区  ›  Martin Braun

ViewState覆盖PostBack上动态添加的UserControl(在占位符中)的更改

  •  1
  • Martin Braun  · 技术社区  · 9 年前

    _测试.aspx

    <asp:ScriptManager runat="server" />        
    <asp:DropDownList ID="ddl" runat="server" DataSource='<%# new string[] { "A", "B", "C" } %>' />
    <asp:Button ID="b" runat="server" UseSubmitBehavior="false" OnClick="b_Click" Text="Test 1" />
    

    protected void Page_Load(object sender, EventArgs e)
    {
      this.DataBind();
      this.ddl.SelectedValue = "B";
    }
    
    protected void b_Click(object sender, EventArgs e)
    {
      Console.WriteLine("Updated");
    }
    

    在这个例子中 ddl 将在上绑定“A”、“B”和“C” Page_Load


    在我的例子中,我需要在动态加载的 UserControl 添加到 Placeholder .因为一个 占位符 不会持久化每次回发时重新创建控件所需的内容。这个 ViewState 似乎没问题。以下是一个示例:

    _测试.aspx

    <asp:ScriptManager runat="server" />
    <asp:PlaceHolder ID="ph" runat="server" />
    

    _测试.aspx.cs

    protected void Page_Load(object sender, EventArgs e)
    {
      _TESTUC uc = (_TESTUC)this.Page.LoadControl("~/Controls/_TESTUC.ascx");
      this.ph.Controls.Add(uc);
    }
    

    _测试.ascx

    <asp:DropDownList ID="ddl" runat="server" DataSource='<%# new string[] { "A", "B", "C" } %>' />
    <asp:Button ID="b" runat="server" UseSubmitBehavior="false" OnClick="b_Click" Text="Test 2" />
    

    _测试.ascx.cs

    protected void Page_Load(对象发送方,EventArgs e)
    {
    this.DataBind();
    此.ddl。SelectedValue=“B”;
    }
    
    protected void b_Click(对象发送方,EventArgs e)
    {
    Console.WriteLine(“已更新”);
    }
    

    同样,每次回发时,我都想重置 DropDownList 出于测试目的,但有趣的是它记住了我的选择。

    我能做什么来解决这个问题?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Martin Braun    9 年前

    在写这个问题时,我想到了解决方案,但无论如何,我决定把它发布给其他人。

    似乎ASP。NET将加载 ViewState 之间 Page_Init Page_Load 在ASPX中定义的控件中,同时加载 对象 之间 页面_加载 Page_LoadComplete 在代码隐藏中加载的控件中。

    设置中的值 解决了问题:

    protected void Page_Init(object sender, EventArgs e)
    {
      this.Page.LoadComplete += new EventHandler(this.Page_LoadComplete);
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
      this.DataBind();
    }
    
    protected void Page_LoadComplete(object sender, EventArgs e)
    {
      this.ddl.SelectedValue = "B";
    }
    
    protected void b_Click(object sender, EventArgs e)
    {
      Console.WriteLine("Updated");
    }