保存到会话似乎会在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>
您的线路问题
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大喊:'。。。每次加载页面时…'引发了令人震惊的顿悟!