【发布时间】: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,所以这更安全。尝试以声明方式注册事件:<asp:Repeater runat="server" ID="rptItems" OnItemDataBound="rptItems_ItemDataBound"> -
另外,您使用的是 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