我确定对此有一个非常简单的解释,但我现在已经把头发撕掉太久了所以我为了理智而呼吁SO!
这很简单:我有一个ListView
在页面首次加载时被绑定(并且在回发时再次不再)。它是表格的一部分。在第一次加载时,我看到了项目列表,但是当我回发时,我看到了EmptyDataTemplate
。这是正确的行为吗?我确信ListView
作为数据绑定控件应该将其列表保留在回发之上。这是代码,第一个前端:
<asp:ListView ID="boxes" runat="server" ItemType="Model.Generic.ILookupEntity<int>" EnableViewState="true">
<LayoutTemplate>
<div>
<ul class="contact-list checkbox-row">
<li id="itemPlaceholder" runat="server" />
</ul>
</div>
</LayoutTemplate>
<ItemTemplate>
<li>
<label>
<asp:CheckBox ID="cb" runat="server" />
<asp:HiddenField ID="value" runat="server" Value="<%# Item.Key %>" />
<span><%# Item.Value %></span>
</label>
</li>
</ItemTemplate>
<EmptyDataTemplate>
<p>No data</p>
</EmptyDataTemplate>
</asp:ListView>
<asp:CheckBoxList ID="boxtemp" runat="server" />
然后回到结束:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!IsPostBack)
{
var items = new List<Model.Generic.LookupEntity<int>>()
{
new Model.Generic.LookupEntity<int>(1, "One"),
new Model.Generic.LookupEntity<int>(2, "Two"),
new Model.Generic.LookupEntity<int>(3, "Three"),
new Model.Generic.LookupEntity<int>(4, "Four"),
};
boxes.DataSource = items;
boxes.DataBind();
boxtemp.DataSource = items;
boxtemp.DataTextField = "Value";
boxtemp.DataValueField = "Key";
boxtemp.DataBind();
}
}
我已将boxtemp CheckBoxList
添加为测试。这个保留了其在回发上的数据。但是ListView
并没有。我在这里做错了什么?
更新1
甚至更奇怪的是,如果我添加以下代码并进行调试,变量test
即使在回发时也会引用值 4 。但是当呈现发布的页面时,我仍然会看到EmptyItemTemplate
。
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
var test = boxes.Items.Count;
}
更新2
我已经确认这不是预期的行为,我现在已经找到了我认为的原因。 ListView
位于this.DataBind()
上正在调用PreRender
的用户控件中。我认为这导致内部的所有数据绑定控件在回发时重新绑定。奇怪的是,如果我处理ListView
的{{1}}和OnDataBinding
事件,在回帖后我可以观察到列表在两个事件期间仍然包含4个项目。但仍然呈现显示OnDataBound
。鉴于这种情况,并假设需要父控制的EmptyDataTemplate
电话,有人可以提出最佳解决方案吗?