使用ASP.NET 4.0
这里有点奇怪,我的代码可以工作,但我不知道为什么!
所以我有一些像这样的HTML:
<asp:Repeater runat="server" ID="uxMyRepeater" ClientIDMode="Predictable">
<ItemTemplate>
<asp:Button runat="server" Text="Submit" />
<asp:HiddenField runat="server" ID="uxIsVisibleHiddenField" Value="0" />
</ItemTemplate>
</asp:Repeater>
后端:
Protected Sub uxMyRepeater_ItemCommand(source As Object, e As RepeaterCommandEventArgs) Handles uxMyRepeater.ItemCommand
uxIsVisibleHiddenField.Value = "1"
End Sub
因此,由于某种原因这种方法有效,通常我希望必须在uxMyRepeater_ItemCommand中声明uxIsVisibleHiddenField,如下所示:
Dim uxIsVisibleHiddenField As HiddenField = DirectCast(e.Item.FindControl("uxIsVisibleHiddenField"), HiddenField)
但在这种特殊情况下,它没有声明性陈述。任何人都可以解释为什么会这样做吗?
请注意,这只是示例代码,而不是我的实际代码。
修改
忘记提到每个RepeaterItem周围都有一个UpdatePanel,删除它会导致Visual Studio给出一个我期望的错误:'uxIsVisibleHiddenField'未声明。由于其保护级别,它可能无法访问。
答案 0 :(得分:1)
只有当控件具有位于转发器外部的相同ID时,才会发生这种情况。您不会发生ID冲突,因为转发器是命名容器。
答案 1 :(得分:0)
你有AlternatingItemTemplate
吗?它可能在该特定区域被宣布并且仍未被注意到。
答案 2 :(得分:0)
经过大量调试之后我唯一可以说的是当我在Repeater ItemTemplate中有一个UpdatePanel时,我不需要在DataBind事件中访问它时声明ItemTemplate中的控件,这很奇怪。取出UpdatePanel会导致编译器错误,因此UpdatePanel必须在Repeater和控件之间进行一些自动连接。
感谢你的所有建议。