ViewState覆盖PostBack

时间:2016-09-16 00:57:49

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

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

就我而言,我需要在动态加载的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的选择以用于测试目的,但有趣的是它会记住我的选择。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

似乎ASP.NET会在ASPX中定义的控件中加载ViewStatePage_Init之间的Page_Load,同时在{{1}之间加载ViewState在代码隐藏中加载的控件中的{和Page_Load

Page_LoadComplete中设置值可解决问题:

Page_LoadComplete