保存到会话似乎在Repeater ItemDataBound事件期间擦除了值

时间:2012-01-21 17:28:35

标签: c# asp.net

这很奇怪。我将通过以下示例尝试解释我的痛苦:

我在会话中有一个对象: 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>

2 个答案:

答案 0 :(得分:2)

你的行问题

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;

答案 1 :(得分:0)

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

此外,我正在使用太大的数据集 - 我将遍历前5个循环并看到值已设置,然后只是F5。直到今天早上我清醒过来并且只是在每个函数中放置断点,这样我才能看到执行顺序并理解它到底发生了什么。然后这是一个令人头疼的时刻......很快就会有一个线路改变以解决问题......然后是一种兴高采烈的感觉。编程没有乐趣吗?

干杯并感谢您的帮助!

PS - 向Kochobay喊出这条线:'......每次加载页面......',这引起了头部的顿悟!