- PR -

ASP.NETにおけるウィドウ間のフォームデータ送信について

投稿者投稿内容
Hilda
常連さん
会議室デビュー日: 2006/02/12
投稿数: 37
投稿日時: 2006-11-01 15:48
いつもお世話になっています。
現在、ASP.NET以下の内容で困っています。
対処方法をご存知の方がいらっしゃいましたら、ご教授をお願いいたします。

<やりたいこと、困っていること>

1.Window(1)で対象(チェックボックス)を選択
2.Window(1)のButton A(linkbutton)を押下してWindow(2)を開く
3.Window(1)で選択されたものの状態(プロパティ等)、Window(2)表示
→手順3で、選択されたチェックボックス値が取得できない場合があり、困っています。

<現在の実装方法>
・JavascriptでWindow(1)のButton Aのonclickイベントにwindow.open()を使用して
Windows(2)を開く。

・手順1の、チェックボックスの内容は、ASP.NETのButton Aのクリックイベントで
選択されたデータを保存(Session、Application等の一時的な保存領域等。)

・Window(2)を開く際に、(一時格納場所より)保存データをよみこんで、表示

以下のとおり、ASP.NETとJavascriptを併用しているため、ASP.NETのクリックイベントが実行される前に
Windows(2)を開いてしまうことがあり、選択されたチェック状態取得に失敗してしまいます。
(window.open()はクライアントで実行され、ASP.NETのイベントはサーバで実行されるため
通常同期されないため。)

<対処方法について>
・ASP.NETのクリックイベントが実行時に、Page.RegisterStartupScript()でwindow.open( <Wondow(2)>を開くjavascript )
を実行すれば、Window(2)では必ず選択されたチェックボックス値を取得することができますが、
これでは、ボップアップブロックされてしまいます。
(ポップアップブロックを回避するため、現状onclickイベントでwindow.open()しています)

・Javascriptで取得した値をAPS.NETに渡す方法について
Window(2)でJavascriptを使用してWindow(1)の状態を取得し(※opner.formで、フォームの状態は取得可能と考えています)
Javascriptで取得したデータをASP.NETで読み込めれば実現できるかと思いますが、
方法をご存知の方がいらっしゃいましたらご教授願います。
→やはりこの場合、Window(2)がJavascriptで取得した値を自分自身にpostさせなければならないような
気もします。
※選択されたチェックボックスの状態(プロパティ等)を取得するためには、ASP.NET側でサーバにアクセスさせなければならないため
Window(2)ではJavascriptだけで処理を終わらせることができません。

・別ウインドウのため、Server.Transfer("も使用できないと考えております。

ページ間でサーバー コントロール値を渡す
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconPassingServerControlValuesBetweenPages.asp

・.NET FrameWk 1.4を使用しているため、linkbuttonに"postbackurl"を設定して、 Window(1)のポスト先データを
Window(2)に送る方法は使用できないようです。

ASP.NET Web ページにおけるページ間ポスティング
http://msdn2.microsoft.com/ja-jp/library/ms178139.aspx

<参考URL>
方法 : ASP.NET Web ページ間で値をやり取りする
http://msdn2.microsoft.com/ja-jp/library/6c3yckfw.aspx

<前提条件>
ASP.NET 1.0
.NET FrameWk 1.4
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-01 17:01
.NET Framework は1.4ではなく1.1でしょうね。
v1.1.4322、じゃないかな。
で、この場合はASP.NETもバージョンは1.1ですね。

一番素直な方法としては、チェックボックスのAutoPostBackをtrueにして
チェックボックスが選択されたときに一度PostBackし、その時点での情報を
Session変数等に格納しておく、という方法だと思います。
これだと、新しいWindowを開いたときにSession上の情報を取り出すだけでいいはず。
未記入
ベテラン
会議室デビュー日: 2003/06/26
投稿数: 76
投稿日時: 2006-11-01 17:53
1.window.document.readyStateでwindow(2)の状態確認
 ん〜〜っ、ループしてreadyStateが変更されるのを待つのは危険かな〜。

2.window(2)でwindow(1)のボタンを押す
 opener.document.getdocumentbyid('ボタン').click();

文法は適当です。ほぼ合ってるかな?
Hilda
常連さん
会議室デビュー日: 2006/02/12
投稿数: 37
投稿日時: 2006-11-01 18:31
どっとねっとふぁん様、ぜうす様
ご返信ありがとうございます。

>どっとねっとふぁん様

>.NET Framework は1.4ではなく1.1でしょうね。
>v1.1.4322、じゃないかな。
>で、この場合はASP.NETもバージョンは1.1ですね。

その通りです。
申し訳ありませんでした。

>一番素直な方法としては、チェックボックスのAutoPostBackをtrueにして
>チェックボックスが選択されたときに一度PostBackし、その時点での情報を
>Session変数等に格納しておく、という方法だと思います。

ご回答ありがとうございます。

この方法だと実現が可能ですね。
ですが、チェックボックスをクリックするたびに
ブラウザ⇔サーバを往復されてしまうため、選択に時間がかかるので
この方法は使用できないことになっています。

(登録データ件数は最大1万件程度あり、
Window(1)を表示する際に必ず検索を行って表示するため
1回のポストバックでも数秒かかってしまい、非常に
使用しづらくなってしまいます。)

>ぜうす様

ご回答ありがとうございます。

>1.window.document.readyStateでwindow(2)の状態確認
> ん〜〜っ、ループしてreadyStateが変更されるのを待つのは危険かな〜。

window.document.readyStateが読み込み済=イベントも処理済
と判断するのですね。
たしかに、window.document.readyStateが読み込み済=イベントも処理済
という等式が必ずしもなり立たないことについて、危険とおっしゃって
おられるのでしょうか。
(たしかにイベントでエラーがでても何もできないですからね・・・)

>2.window(2)でwindow(1)のボタンを押す
> opener.document.getdocumentbyid('ボタン').click();

すみません、ちょっとわからなかったのですが、
以下の認識でよろしいでしょうか。

-----

window(2)表示時にwindow(1)のボタンを押す
(window(2)は、何も表示せず待つ?)

window(1)で、ボタンのクリックイベント処理
データを保存、
Window(2)をリロード?
(読み込み完了クエリ等を入れるなどしてWindow(2)更新)

Window(2)再表示
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-01 18:49
> 登録データ件数は最大1万件程度あり、
> Window(1)を表示する際に必ず検索を行って表示するため
> 1回のポストバックでも数秒かかってしまい、非常に
> 使用しづらくなってしまいます。

いくら検索を行うからといっても1万件程度のデータで表示に数秒、
というのは何か問題があるような気もします。

まぁ、データの形式やサーバの処理能力等がわからないのでなんともいえませんが。
Hilda
常連さん
会議室デビュー日: 2006/02/12
投稿数: 37
投稿日時: 2006-11-01 19:51
どっとねっとふぁん様

ご返信ありがとうございます。

>いくら検索を行うからといっても1万件程度のデータで表示に数秒、
>というのは何か問題があるような気もします

普通はポストバック処理でも1秒以内ぐらいには
画面の再表示処理が終わるものなのでしょうか。
(こんなもんかなと思っていました(^ ^)

DBまわりは別の担当者のため、性能についてはわかりかねますが、
HTML表示にテーブルや、画像をたくさん使用しているのも
原因かもしれません。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-01 22:12
ページ2が表示される前に、必ずサーバ コードが走ります。
ですから、セッション情報がセットされるまで、ページ2の送信を延期しても良いですね。

また、タイムアウトの危険があるなら、セッション情報がセットされるまで、ページ2のダミーページをリロードさせる、という手も考えられます。
_________________
未記入
ベテラン
会議室デビュー日: 2003/06/26
投稿数: 76
投稿日時: 2006-11-02 09:17
ごめんなさい、実現したいことを読み間違えていたようで、頓珍漢な答えになってました。

readyStateでのwaitは、クライアントの処理を阻害しますので危険です。タイマーでも使わないとCPU使いまくっちゃいますから...。

3.window(1)表示時に全ての情報をSessionに設定しておき、最低限の情報だけwindow(2)にGETで渡す手す...安直?

4.window(1)のbutton押下時にAJAXでSessionに設定してからwindow(2)を開く

なんか、小手先で誤魔化そうとしているような...。

皆さんが言うように、DB検索を早くするのが一番シンプルでわかりやすい回答ではないでしょうか。複雑怪奇なJavaScriptはメンテ出来ませんぜ〜、旦那!

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