【问题标题】:ViewState overwrites changes on dynamically added UserControl (in Placeholder) on PostBackViewState 覆盖 PostBack 上动态添加的 UserControl(在占位符中)的更改
【发布时间】:2017-01-24 03:29:42
【问题描述】:

在我的 ASP.NET 应用程序中——启用 ViewState——我可以通过简单地重新设置输入来重置输入。这是一个有效的基本简单示例:

_TEST.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" />

_TEST.aspx.cs

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 将与 Page_Load 上的“A”、“B”和“C”绑定,并且始终选择“B”。因此,当您更改选择并提交时,它将被重置。想象一下,这用于在特定条件下重置某些控件。


在我的情况下,我需要动态加载的 UserControl 上的这种行为,该行为被添加到 Placeholder。因为Placeholder 不会保留我需要在每次回发时重新创建控件的内容。 ViewState 似乎没问题。这是一个示例:

_TEST.aspx

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

_TEST.aspx.cs

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

_TESTUC.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" />

_TESTUC.ascx.cs

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

再次,在每次回发时,我都想重置DropDownList 的选择以进行测试,但有趣的是它会记住我的选择。

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

【问题讨论】:

    标签: c# asp.net webforms viewstate page-lifecycle


    【解决方案1】:

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

    似乎 ASP.NET 将在 ASPX 中定义的控件中加载 Page_Init 和 Page_Load 之间的 ViewState,而在加载的控件中加载 Page_Load 和 Page_LoadComplete 之间的 ViewState在代码隐藏中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2020-11-28
      • 2022-08-16
      • 2014-08-06
      相关资源
      最近更新 更多