【问题标题】:ASP.NET HiddenField value duplicated in Repeater after postback回发后在 Repeater 中重复的 ASP.NET HiddenField 值
【发布时间】:2015-10-08 09:44:46
【问题描述】:

我有一个Repeater 和一个Button 控件。在Repeater 内我有一个HiddenField 控件:

<asp:Repeater runat="server" ID="rptItems">           
    <ItemTemplate>                          
        <asp:HiddenField runat="server" ID="hfReportId"></asp:HiddenField>
    </ItemTemplate>
</asp:Repeater>

<asp:Button runat="server" ID="btnSave" Text="Save" /> 

在后面的代码中,我将ItemDataBound 事件处理程序绑定到Page_Load: 中的Repeater

this.rptItems.ItemDataBound += new RepeaterItemEventHandler(rptItems_ItemDataBound);

在事件处理程序中,我以编程方式设置HiddenField 控件的值:

protected void rptItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        var hfReportId = (HiddenField)e.Item.Controls[0].FindControl("hfReportId");
        hfReportId.Value = "TestValue";
    }    
}

到目前为止,这按预期工作,HiddenField 的值设置为“TestValue”。

回发时出现问题。如果我单击 Save 按钮,ItemDataBound 事件处理程序将再次触发,HiddenField 的值再次设置,但原始值保持不变,我最终得到一个值“TestValue,TestValue”。我已将 HiddenField 换成标签控件,但这种行为不会发生。

我已单步执行代码,当ItemDataBound 事件处理程序在回发时触发时,HiddenField 没有任何价值。

感谢任何帮助。

【问题讨论】:

  • 不要使用(HiddenField)e.Item.Controls[0].FindControl("hfReportId");,而是使用(HiddenField)e.Item.FindControl("hfReportId");。他RepeaterItem 是NamingContainer,所以这更安全。尝试以声明方式注册事件:&lt;asp:Repeater runat="server" ID="rptItems" OnItemDataBound="rptItems_ItemDataBound"&gt;
  • 另外,您使用的是 JQuery 和/或 ASP.NET Ajax 吗?这个中继器在 jQuery UI 对话框中吗?
  • 是的 - 我正在使用 ASP.NET Ajax。这似乎是问题的原因 - 当我删除它时,HiddenField 会按预期更新。似乎 HiddenField 控件的处理方式与 Label 控件不同?
  • @Ash - 你在用Ajax做什么?还有,你的中继器是怎么绑定的?确保通过检查 !IsPostBack 来做到这一点。
  • @Ash:我猜这是ViewState 问题,HiddenField.Value 存储在 ViewState 中,Label.Text 不是。如果您使用像jQUery 这样的客户端库,它还可能导致控件被多次呈现,这会重复该值并附加一个逗号。 I've also noticed it some time ago(搜索更新)。

标签: c# asp.net repeater hiddenfield itemdatabound


【解决方案1】:

您应该必须在您的 aspx 页面中绑定在转发器中绑定的项目数据的事件,例如

OnItemDataBound="repeater_ItemDataBound"

在绑定转发器时使用页面加载 ispostback 属性

if(!IsPostback)
{
   //Bind repeater
}

然后在item数据绑定中使用

var hfReportId = (HiddenField)e.Item.FindControl("hfReportId");

而不是

var hfReportId = (HiddenField)e.Item.Controls[0].FindControl("hfReportId");

快乐编码

【讨论】:

    【解决方案2】:

    我在 asp:Repeater 中的 asp:HiddenField 也遇到了同样的问题。 问题是: 在 PostBack 上,我的 asp:Repeater 中的值使用 PageLoad() 方法中的 DataBind() 刷新,而不是 ButtonSearch_click() 事件方法。 这就是为什么我仍然在我的 asp:Repeater 的 asp:HiddenField 中获得旧值的原因。

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 2015-08-11
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      相关资源
      最近更新 更多