.ascx中的控件未在回发时显示其新值

时间:2012-05-10 16:00:16

标签: asp.net

这似乎是一个基本问题,但它让我感到难过。

我有一个主页面,它在page_load上加载自定义控件(.ascx)。

此自定义控件有两个字段。其中一个是下拉列表,另一个是文本框。当下拉列表更改值时,它会触发回发,服务器端会执行某些逻辑,并为文本框生成一个值。我逐步完成了代码,并创建并正确分配了值。但是,在呈现页面时,值不会更改。

如果我将文本框值更改为“QQQ”并触发回发,则“QQQ”将保留在文本框中,以便我可以验证viewstate是否正常工作。

是否有任何理由说明生成的值未在回发中的表单中显示。此过程在初始页面加载时工作正常。

.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
   string ascxPath = @"~/_CONTROLTEMPLATES/TRC_BITS.ascx";
   TRC_BITS control = Page.LoadControl(ascxPath) as TRC_BITS;
   phForm.Controls.Add(control);
}

的.ascx

   <asp:TextBox ID="message" runat="server" TextMode="MultiLine" /><br/>
   <asp:DropDownList ID="year" runat="server" AutoPostBack="true">
      <asp:ListItem Text="2011">2011</asp:ListItem>
      <asp:ListItem Text="2012">2012</asp:ListItem>
      <asp:ListItem Text="2013">2013</asp:ListItem>
   </asp:DropDownList>

.ascx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        year.SelectedValue = DateTime.Now.Year.ToString();
    }
    if (year.SelectedValue == 2012)
       message.Text = "ABC";
    else
       message.Text = "XYZ";
}

2 个答案:

答案 0 :(得分:4)

因为您要动态地将这些控件添加到页面,所以需要为用户控件分配ID。每次回发页面时,请确保为控件分配相同的ID,并且将从ViewState重新填充字段。

另外,正如Shai建议的那样,如果您在OnInit而不是Page_Load期间加载了控件,那将更合适。用户控件的情况略有不同,但通常您希望在执行LoadViewState方法之前添加动态内容。

enter image description here

如果您正在寻找可以解决持久动态内容问题的问题,我建议您查看DynamicControlsPlaceHolder

答案 1 :(得分:2)

因为您要动态添加控件,所以需要在页面的oninit事件期间添加它们。 试试吧,相信我。去吧。雅拉。