为什么我的ListView会在回发时丢失数据?

时间:2017-04-27 20:19:24

标签: c# asp.net webforms

我确定对此有一个非常简单的解释,但我现在已经把头发撕掉太久了所以我为了理智而呼吁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电话,有人可以提出最佳解决方案吗?

0 个答案:

没有答案