2012-01-21 7 views
0

これは異常です。私は、次の例で私の痛みを説明してみましょう:セッション[「reportQuestionGroupingTracker」]リピーターのOnItemDataBoundイベント中にセッションに保存中の値が消去されているようです

私は、セッション内のオブジェクトを持っています。それは文字列のリストを含んでいます。文字列が見つからないときは、文字列リテラルを介して新しいh3ヘッダがリピータに書き込まれます。

問題は次のような行です。セッション["reportQuestionGroupingTracker"] = ary;この行は、何とか(黒)魔法のように文字列値をlit.Textに取り除いているようです。値は、コードをブレークポイントし、関数のスコープから外れるまで残っているように見えます(つまり、一部は期待どおりに動作するようになります)。しかし、文字列値はASP.NETページのLiteralコントロールには決して反映されません - 彼らは常に空白です。私は、問題のある行またはその行コメントアウトかのことを

注:(!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に変更しようとしましたが、Sessionの代わりにContext.Itemsオブジェクトを使用しようとしましたが、ArrayListの代わりにListが使用されましたが、私は邪魔です。助けて!

私はまた、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変数には、私が期待しているものが含まれています。それが空白であると想定されているときに、見出しを含むはずです。問題は、RepeaterItemのDataBind中にこのコードが実行された後で、コメントアウトしない限り、リテラルには値が得られないようです – Lanceomagnifico

0

をロードされたリテラルテキストを読み込む必要がありますが、 As Michealは、データバインドルーチンがページロードごとに2回ヒットしたと考えていました。最初のセッションは正しく設定されますが、2度目の場合、if(!ary.Contains(headingText))が正しく指示されたため、ヘッダーはスキップされます。 2つのデータ結合ヒットに気付かなかったのは悪いです。私は非常に愚かな気がする。疲れている間のコーディングは、このような明白な問題の理由ではありません。あなたの時間を無駄にして申し訳ありません!

また、私はあまりにも大きなデータセットで作業していました。最初の5つのループを見て、値が設定されていることを確認してからF5だけを参照します。私は今朝明け暮れになり、すべての機能にブレークポイントを設定して、実行命令を見て、何が起きているのかを理解するまではありませんでした。そして、それは頭が痛い瞬間だった...すぐに問題を解決するために一行の変更が続いた...そして、怒りの感情。プログラミングは楽しいものではありませんか?

感謝して助けてくれてありがとう!

PS - ココビジョンに行こう:'...毎回ページが読み込まれました...'これはヘッドラッピングの出現を誘発しました!

関連する問題