Это странно. Я попытаюсь объяснить свою боль следующим примером:Сохранение сеанса, похоже, стирает значение во время события OnItemDataBound ретранслятора
У меня есть объект в сеансе: Сессия ["reportQuestionGroupingTracker"]. Он содержит список строк. Когда строка НЕ найдена, новый новый заголовок h3 записывается в ретранслятор через строковый литерал.
Проблема заключается в следующем: Сессия ["reportQuestionGroupingTracker"] = ary; Эта строка кажется как-то (черная) магически удаляет строковое значение в lit.Text. Значение есть, когда я прерываю код и, похоже, сохраняюсь до тех пор, пока он не выйдет из области действия в функции (так что эта часть работает так, как ожидалось), но значение строки никогда не попадает в элемент управления Literal на странице ASP.NET - они всегда пусты.
Обратите внимание, что если я закомментируйте проблемную линию или строку: если, заголовки показывают (но слишком многие из них, так как каждая итерация запускает запись заголовка) (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;
}
}
}
Я был на этом в течение нескольких часов, ударив головой - я делал подобные вещи сотни раз, я просто не могу понять, почему он не работает на этот раз! Я попытался изменить ретранслятор в DataList, пробовал использовать объект Context.Items вместо сеанса, вместо 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>
Когда вы привязываете данные к ретранслятору? Если вы используете Session, не будут ли все заголовки в ArrayList уже в следующий раз, когда страница будет отображаться? –
Я очищаю эту переменную сеанса во время Page_Load, поэтому она обновляется каждый раз, когда страница начинает обработку. – Lanceomagnifico
Когда вы вызываете DataBind на повторителе? Возможно ли, что вы связываете ретранслятор несколько раз? –