【问题标题】:Controls within .ascx are not displaying their new value on postback.ascx 中的控件在回发时未显示其新值
【发布时间】:2012-05-10 16:00:15
【问题描述】:

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

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

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

如果我将文本框的值更改为“QQQ”并触发回发,“QQQ”会留在文本框中,因此我可以验证视图状态是否正常工作。

是否有任何原因导致回发时生成的值没有显示在表单中。此过程在初始页面加载时运行良好。

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

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

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

    如果您正在寻找一些东西来减轻持久动态内容的痛苦,我建议您查看DynamicControlsPlaceHolder

    【讨论】:

    • @ShaiCohen:是的,但是当向表单添加更多控件时,生成的 ID 可以并且将会改变,这会导致逻辑中断。
    【解决方案2】:

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

    【讨论】:

    • 这不是一个完整的答案。根据实现,它可能会或可能不会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多