保存到会话似乎会在Repeater';s OnItemDataBound事件

本文关键字:事件 OnItemDataBound Repeater 会话 保存 | 更新日期: 2023-09-27 18:20:55

这很奇怪。我将尝试用以下例子来解释我的痛苦:

我在会话中有一个对象:Session["reportQuestionGroupingTracker"]。它包含一个字符串列表。当没有找到字符串时,会通过字符串文字在中继器中写入一个新的h3标头。

问题似乎是这样的:Session["reportQuestionGroupingTracker"]=ary这一行似乎以某种方式(黑色)神奇地删除了lit.Text中的字符串值。当我中断代码时,该值就在那里,并且似乎一直存在,直到它超出函数的范围(这样部分就可以像预期的那样工作)-但字符串值似乎从未到达ASP.NET页上的Literal控件-它们总是空白的。

请注意,如果我注释掉问题行或此行:if(!ary.Contains(headingText)),则会显示标题(但标题太多了,因为每次迭代都会触发标题写入)。

protected void rptQuestionsGroupedByCountry_OnItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        ArrayList ary = new ArrayList();
        if (null != Session["reportQuestionGroupingTracker"]) ary = (ArrayList)Session["reportQuestionGroupingTracker"];
        if ((item.ItemType == ListItemType.Item) ||
            (item.ItemType == ListItemType.AlternatingItem))
        {
            DataRowView dr = (DataRowView)e.Item.DataItem;
            string headingText = dr["Heading"].ToString();
            Literal lit = (Literal)e.Item.FindControl("LiteralHeader");
            if (!ary.Contains(headingText))
            {
                lit.Text = String.Format(@"<h3 class=""questionGroupingHeader"">{0}</h3>", headingText);
                lit.Visible = true;
                ary.Add(headingText);
                Session["reportQuestionGroupingTracker"] = ary;
            }
        }
    }

我已经做了几个小时了,我的头砰砰作响——我以前做过数百次类似的事情,我只是不明白为什么这次不起作用!我曾尝试将Repeater更改为DataList,尝试使用Context.Items对象而不是Session,尝试使用List而不是ArrayList,但我遇到了障碍。帮助

我也试过在IIS 6中运行它,以防它有点奇怪,但输出是一样的。这是一个ASP.NET 4.0项目。

以下是aspx页面中的代码:

 <asp:Repeater ID="rptQuestionsGroupedByCountry" runat="server" OnItemDataBound="rptQuestionsGroupedByCountry_OnItemDataBound">
<HeaderTemplate><table></HeaderTemplate>
<ItemTemplate>
    <tr><td>
    <asp:Literal ID="LiteralHeader" runat="server" Visible="false" />
    <h3 class="report-country-tag"><%#DataBinder.Eval(Container, "DataItem.Numbers")%>.<%#DataBinder.Eval(Container, "DataItem.QusetionName")%></h3>
    <div class="report-content">
                        <%#DataBinder.Eval(Container, "DataItem.Answer")%>
    <p class="date">Date Updated: <%#DataBinder.Eval(Container, "DataItem.DocumentModifiedWhen")%></p>
                        </div>
    </td></tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>

保存到会话似乎会在Repeater';s OnItemDataBound事件

您的线路问题

if (!ary.Contains(headingText))

每次页面加载时,必须填充文字

    if (!ary.Contains(headingText))
    {
        ary.Add(headingText);
        Session["reportQuestionGroupingTracker"] = ary;
    }
    lit.Text = String.Format(@"<h3 class=""questionGroupingHeader"">{0}</h3>", headingText);
    lit.Visible = true;

正如Micheal所怀疑的那样,每次加载页面时,数据绑定例程都会被命中两次。会话的第一次设置正确,但第二次跳过了Headers,因为if(!ary.Contains(headingText))正确地告诉了它。我很抱歉没有注意到这两个数据绑定命中。我觉得自己很愚蠢。疲劳时编码并不能成为这种明显问题的借口。很抱歉浪费了你的时间!

此外,我正在处理一个太大的数据集——我会遍历前5个循环,看到值正在设置,然后只有F5。直到今天早上我头脑清醒,在每个函数中都设置了断点,这样我就可以看到执行顺序,了解到底发生了什么。。。很快,只需更改一行即可解决问题。。。然后是一种兴高采烈的感觉。编程不是很有趣吗?

干杯,谢谢你的帮助!

PS-向Kochobay大喊:'。。。每次加载页面时…'引发了令人震惊的顿悟!