- PR -

【C#】画面遷移時にSession情報がうまく引き継げない

投稿者投稿内容
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-09-09 11:31
画面Aのデータグリッドに表示したデータをArrayList配列に格納後、Sessionに入れて
画面Bにて表示する処理があります。
画面遷移の方法には、データグリッド上に表示されるリンク(<A href・・・)による遷移と、ボタン押下(Response.Redirect)による遷移の2パターンがあります。
ボタン押下による遷移の場合は、画面BにてArrayList配列のデータが全件取得できる
のですが、リンク遷移した場合は、ArrayList配列のデータの一部しか取得できません。
※ArrayList配列のカウントを調べるとデータ件数が減ってました。

リンク表示で画面遷移した場合だけ何故全件データが取得できないのか、原因がさっぱり
わからず困ってます。
推測でも構いませんが、何かわかる方はいらっしゃいませんか?

ちなみに関係あるかわかりませんが、Web.ConfigのsessionStateはInProcです。
また、ArrayList配列のデータはデータグリッドに表示するタイミングで表示したデータを
全件しまっているため、プログラムミスではないと思われます。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-09 11:40
ボタンの場合もリンクの場合も同じ遷移先ですか?
リンクの場合は違うWebアプリケーション先だったりとか?
(一部は取得できてるからそれはないか)
周辺ソースコードを出せたりできますか?


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-09 11:44 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-09-09 11:59
引用:

村長さんの書き込み (2005-09-09 11:31) より:
プログラムミスではないと思われます。



おお〜、すごい自信だ。

ボタンのイベント処理ではResponse.Redirectだけしかしていないのかもしれませんが、サーバー側では他の一連の処理も動いているので、そこで変更がされているとか。
例えばPage_Load()でデータを再取得しているとかね。

あるいは"減って"いるのではなく、元々別のオブジェクトを見ているとか。

セッションに設定するArrayListの内容を、DataGridにバインドしたりセッションに設定したりする前にプログラム内で適当に書き換えてみて(DateTime.Nowなんかを絡めると変更時が分かって好ましいですね)、その後遷移先のページで見てみるとか。


ほぅら、コードで設定した時間と違う時間が入っているでしょう?
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-09-09 12:30
どもです。がると申します。
んっと…ちと確認などしつつ。
引用:

村長さんの書き込み (2005-09-09 11:31) より:
画面Aのデータグリッドに表示したデータをArrayList配列に格納後、Sessionに入れて
画面Bにて表示する処理があります。


画面Aの要素を引数にrequestを発行して画面Bをresponceさせるですね。

引用:

画面遷移の方法には、データグリッド上に表示されるリンク(<A href・・・)による遷移と、ボタン押下(Response.Redirect)による遷移の2パターンがあります。
ボタン押下による遷移の場合は、画面BにてArrayList配列のデータが全件取得できる
のですが、リンク遷移した場合は、ArrayList配列のデータの一部しか取得できません。
※ArrayList配列のカウントを調べるとデータ件数が減ってました。

リンク表示で画面遷移した場合だけ何故全件データが取得できないのか、原因がさっぱり
わからず困ってます。
推測でも構いませんが、何かわかる方はいらっしゃいませんか?


Webの基礎をちゃんとやってればわりとわかりやすいと思うのですが…。
ポイントは
引用:

画面遷移の方法には、データグリッド上に表示されるリンク(<A href・・・)による遷移と、ボタン押下(Response.Redirect)による遷移の2パターンがあります。


ここです。
恐らくは、ボタン押下の場合、FORMエレメントのactionアトリビュート値がPOSTになっているものと推測されます。
一方で、<A href・・・)による遷移は…普通「データをやり取りするときにはあまり使わない」のですが、恐らく事前にデータを埋め込んでいる形で、hrefアトリビュート値が「xx.aspx?データの羅列」ってなっているのだろうと推測されます。
可能性としては…
・そもそもhrefアトリビュート値を作成する段階でデータが削られている
・Aエレメントからの遷移では「単数」を扱うことしか念頭に置かれていない設計のために複数値が扱えない
・そもそもGETメソッドではデータ長に(比較的短い)制限長があり、その制限長に引っかかっている
あたりでしょうか?

取り合えずまず、AエレメントのURLをちゃんと解析して、必要なデータをそもそも「プログラムに引き渡せるようなURLに」なっているかを確認してみてくださいませ。
その次にチェックするのは「GETによる文字数制限」あたりかな?

頑張ってください。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-09-09 13:15

* おおっと! *

"リンクだと一部しか取得できない"か。逆に読んでました。
すいません。
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-09-09 14:04
皆さん、レスありがとうございます。

>囚人さん

引用: ------------------------------------------------------------------------
  リンクの場合は違うWebアプリケーション先だったりとか?
  周辺ソースコードを出せたりできますか?
------------------------------------------------------------------------------
画面A:
foreach (DataRow row in dsDataGrid.Tables[0].Rows) {
  listData.Insert(listData.Count, row["ManageNo"].ToString());
}
Session["ListData"] = listData;

※Session["ListData"]が問題のSession情報です。
画面Aでは検索ボタンイベント内にある上記の処理以外では一切使用されていません。


画面B:
Lbl_Debug.Text += ((ArrayList)Session["ListData"]).Count.ToString();

上記処理は、画面遷移後すぐに件数を調べるために画面BのPage_Loadの先頭に
記述した処理です。(デバック用のため)
※リンク遷移の場合は、この時点でデータ件数が減っています。

まとめると、画面AではSession["ListData"]を一箇所で入れてるのみ。
他は参照すらしてません。
そして画面Bで一番最初に動くPage_Loadイベントの先頭でSession["ListData"]のデータ件数を調べたところ、一部のデータ件数しかありませんでした。

次に画面遷移の処理ですが、
ボタン遷移:
Response.Redirect("〜URL〜/画面B.aspx?MngNo=1#TOP");
リンク遷移:
<A href=\"〜URL〜/画面B.aspx?MngNo=1&Target=XXXX#TOP\">YYYY</A><BR>
※上記行をデータセットに入れてデータグリッドに表示してます。
 表示上は、YYYYがリンク状態で表示されるようになってます。
XXXXは、画面Bの表示方法に関係するためのもので、本件とは関係ありませんが
できるだけそのままのソースをと思い。。。

>一郎さん

私も最初はプログラムが悪いと思って調べたのですが、上記で説明したとおり
画面Aでは一箇所で設定してるだけで、他では参照すらしてません。
そして、画面BのPage_Loadイベント内の最初で調べたデータ件数がおかしくなってたので、
プログラムの不備ではなさそうだと思いました。
この後、ArrayListの内容を書き換えても調べてみます。


>がるがるさん

引用: ------------------------------------------------------------------------
  恐らくは、ボタン押下の場合、FORMエレメントのactionアトリビュート値がPOSTに
  なっているものと推測されます。
  hrefアトリビュート値が「xx.aspx?データの羅列」ってなっているのだろうと推測されます。

------------------------------------------------------------------------------

私の知識が乏しいのでうまく理解できてるかわかりませんが、
URLにはデータを羅列していません。
あと、URLの長さは約120バイトくらいなので、長くはないと思います。
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-09-09 14:42
回答じゃないですけど。。

引用:
ArrayListの内容を書き換えても調べてみます。



書き換えて確認するのも良いですね。
画面B遷移時にて、Sessionから取り出した
ArrayListの中身は確認されたのでしょうか?
中身の違いから原因を推測したほうが近道かも知れません。

あと、まずありえないケースだとは思いますが。
画面Aの検索イベントハンドラを、
検索ボタンClickイベント以外(Page_Load等)に
誤って設定していないかも見てください。
意図しないタイミングでArrayListを再作成しているかも知れませんので。
#VisualStudioを使い慣れてない人は、
#イベントハンドラの登録ミスで、はまってたので。

参考まで

引用:
* おおっと! *

壁の中?(>_<)

[ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-09-09 14:46 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-09 15:34
listData.Insert(listData.Count, row["ManageNo"].ToString());
ここなんですけど、何故

listData.Add(row["ManageNo"].ToString());
ではないのでしょうか?

その前に listData を使用しているからではないしょうか?
ページ遷移する直前、 listData の個数はどの場合でも変わりませんか?

スキルアップ/キャリアアップ(JOB@IT)