2012-01-21 3 views
0

Это странно. Я попытаюсь объяснить свою боль следующим примером:Сохранение сеанса, похоже, стирает значение во время события 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> 

+0

Когда вы привязываете данные к ретранслятору? Если вы используете Session, не будут ли все заголовки в ArrayList уже в следующий раз, когда страница будет отображаться? –

+0

Я очищаю эту переменную сеанса во время Page_Load, поэтому она обновляется каждый раз, когда страница начинает обработку. – Lanceomagnifico

+1

Когда вы вызываете DataBind на повторителе? Возможно ли, что вы связываете ретранслятор несколько раз? –

ответ

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; 
+0

Да, но я хочу, чтобы Literal.Text заполнялся, когда логика истинна. например: в списке из 20 предметов может быть только 3 заголовка, поэтому я хочу, чтобы 17 предметов имели пустые литералы, причем только 3 из них были заполнены. Эта логика работает нормально! В том случае, когда я нахожусь в Visual Studio и оставил точку кода, переменная lit.Text содержит то, что я ожидаю - когда она должна быть пустой, и когда она должна содержать заголовок, это так. Проблема заключается в том, что после того, как этот код запускается во время DataBind в RepeaterItem, буквальный НИКОГДА не получает значение, если я не закомментирую – Lanceomagnifico

0

В виде Предполагалось, что Micheal дважды загружала рутину привязки данных для каждой загрузки страницы. Первый раз через сессию устанавливается правильно, но во второй раз заголовки пропускаются, потому что , если (! Ary.Contains (headingText)) правильно сказал это. Мой плохой, не замечая двух ударов привязки данных. Я чувствую себя очень глупо. Кодирование во время усталости не является оправданием для такой очевидной проблемы. Извините за то, что тратишь свое время!

Также я работал со слишком большим набором данных - я бы прошел через первые 5 циклов и увидел, что значение было задано, а затем просто F5. Это было только до тех пор, пока я не прояснил это утро и просто поставил точки останова в каждой функции, чтобы я мог видеть порядок исполнения и понять, что происходит. Тогда это был мгновенный момент ... быстро последовало единственное изменение линии, чтобы исправить проблему ... и затем чувство восторга. Разве это не программирование?

Приветствия и благодарности за помощь!

PS - Кричите до Кохобая по линии: '... каждый раз, когда загружалась страница ...', которая вызывала сглаживание эпифана!

Смежные вопросы