C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ASP.NET クリックイベント内でセッション変数他が古い


(過去ログ 178 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■102116 / inTopicNo.1)  ASP.NET クリックイベント内でセッション変数他が古い
  
□投稿者/ TH (1回)-(2023/07/05(Wed) 16:33:55)

分類:[ASP.NET (VB)] 

(1)
ASP.NET のWebFormsを使用したとても古いシステムなのですが、
btnXXX_Clickイベント内で、JSの window.showModalDialog() を利用した<script>を、
RegisterStartupScript() で登録し子画面を表示しています。

この子画面では条件に応じた状態値(1 or 0 か True or False 等の簡単な値)を

btnXXX_Clickイベント内の後続処理に戻し利用したいので、子画面でセッション変数を書いたのですが、
btnXXX_Clickイベントに連携されてきません。
(イベント内でセッション変数はエラーなく読めるが子場面でセットした値が入っていない。)
これは、こういものなのでしょうか?
どこかの設定を変える命令などをイベント内で実行すれば、最新の情報で見れるのでしょうか?

(2)
次に、上記でデータ連携が出来ないため、DB(SQLServer)を介してデータ連携してみようと試みました。
しかし、なんと、子画面で確かに、連携テーブルにInsertした状態値が、btnXXX_Clickイベント内の後続処理では
取得できない(0件)のです。(SSMS等の外部ツールで、確かにテーブルに存在することは確認済み)

どうやら、セッション変数と同様に、イベント開始時点の古い情報世界?スナップショット?

(とでも言いましょうか。。)での情報となっているようです。セッション変数は、なんとなくそんなことも
あるのかとも思いましたが、外部のDB迄、古い情報になっているのは、いったいどういう仕組みなのか
全く理解できません。テーブルアダプタを利用して、問題のイベント内で、Dim New テーブルアダプタ
しているのですが、そこらへんが原因かと思い、イベント内でDB接続からやって、SqlDataReader を使って
データ取得するように書き換えてもみたのですが、やはり、状況は同じでした。
(登録されているはずのデータが見えない)

当方ASPは全く、初心者で、何とか、独学で改修しており、あとは、
イベント内後続処理で、ダイアログ側のデータ連携さえできれば、終わりというところまで作りこみが完了したのですが
ここで引っかかってしまっています。

何か、「古い情報を保持する」のようなスイッチがあるのでしょうか?
特に、DBが古い情報をとってくるのが、訳が分かりません。ここを最新の情をとってくるには
どうすればいいのでしょうか?

なお、当該イベントは、いったん終了まで動作させ、再度ボタンクリックで、
同じイベントを走らせると、先ほど見えなかった情報(セッション変数、DB共)が嘘のように見えるようになっています。
もちろん、今回見えてほしい情報は見えないことに変わりないのですが、

何か、あと少しのところで引っかかているだけなのか?
根本の仕組みから理解できていないのか?

どなたか、お助けください。

引用返信 編集キー/
■102117 / inTopicNo.2)  Re[1]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ WebSurfer (2728回)-(2023/07/05(Wed) 17:29:51)
No102116 (TH さん) に返信

開発環境を書いてください。
(例: Windows 10 の Visual Studio 2022 で ASP.NET Web Forms アプリをターゲット
フレームワーク .NET Framework 4.8 で作っています・・・とか)

> JSの window.showModalDialog() を利用した

それを止めて他の代替手段を取るということはできませんか?

Window.showModalDialog()
https://developer.mozilla.org/ja/docs/Web/API/Window/showModalDialog

"非推奨: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれ
ませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、
互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコード
は更新してください"
引用返信 編集キー/
■102122 / inTopicNo.3)  Re[2]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ TH (2回)-(2023/07/05(Wed) 19:43:37)
> それを止めて他の代替手段を取るということはできませんか?
事情により無理です。

> 開発環境を書いてください。
例示頂いた通りの環境です。

引用返信 編集キー/
■102123 / inTopicNo.4)  Re[3]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ TH (3回)-(2023/07/05(Wed) 19:50:46)
さしあたって、
この現象は、ASP.NET では あたりまえのことなのでしょうか?

コードのどこかで、こういう風に動くように書いているから
そうなるのでしょうか?

わかる人お願い致します。
引用返信 編集キー/
■102124 / inTopicNo.5)  Re[4]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ TH (4回)-(2023/07/05(Wed) 20:05:10)
>何か、「古い情報を保持する」のようなスイッチがあるのでしょうか?

一番初めに上のように書きましたが、(DBのほうは、)トランザクション分離がもしかしたら
関係しているのかもしれない。などと考え、

子画面(Insert側)、親画面(Select側)とも以下のようにしてみましたが
結果は変わらず。



Dim scopeAoption As TransactionOptions = New TransactionOptions()
scopeAoption.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
Using scopeA As TransactionScope = New TransactionScope(TransactionScopeOption.Required, scopeAoption)

//insert または select処理

End Using
引用返信 編集キー/
■102125 / inTopicNo.6)  Re[3]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ WebSurfer (2731回)-(2023/07/05(Wed) 20:13:40)
No102122 (TH さん) に返信

>>それを止めて他の代替手段を取るということはできませんか?
> 事情により無理です。

使えないものを使うのでは自分は考える気力がわいてきませんので撤退します。
悪しからず。
引用返信 編集キー/
■102167 / inTopicNo.7)  Re[1]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ 伝説のカレー (111回)-(2023/07/12(Wed) 16:46:02)
No102116 (TH さん) に返信

> 同じイベントを走らせると、先ほど見えなかった情報(セッション変数、DB共)が嘘のように見えるようになっています。

ぬー不思議な事象ですね

btnXXX_Clickイベント内の処理がRegisterStartupScriptのscriptよりも先に実行される
と仮定すると説明がつくような感じですね

RegisterStartupScriptのscriptの実行タイミングがあやしいんじゃないかなーと思いました
引用返信 編集キー/
■102168 / inTopicNo.8)  Re[2]: ASP.NET クリックイベント内でセッション変数他が古い
□投稿者/ WebSurfer (2741回)-(2023/07/13(Thu) 10:42:16)
No102167 (伝説のカレー さん) に返信

撤退すると言いながら何ですが、気になったので一言・・・

> ぬー不思議な事象ですね

それは不思議では無くて当たり前かと。

サーバー側で起こることとクライアント側で起こることの区別、その順序が理解
されてなくて、以下のようなことを考えていると思います。

protected void btnXXX_Click(object sender, EventArgs e)
{
  (1) RegisterStartupScript
    登録するスクリプトの内容は:    
    ・JavaScript で子画面を表示
    ・子画面でポストバックして Session を設定

  (2) 後続処理
    上の子画面での Session の設定が終わったら
    続いて Session の内容を見て後続処理を行う
}

そんなことはできません。

親画面のボタンクリックでポストバックされ、サーバー側で btnXXX_Click が動き、
(1), (2) のコード(及びその他のサーバー側での全ての処理)が終わってから応答
がブラウザに返ってきてスクリプトが登録され、初めて上の「JavaScript で子画面
を表示」となります。

その時点では (2) は終わってます。つまり (1) に書いた「子画面でポストバック
して Session を設定」は (2) の後の話なので、当然 (2) では Session は取得で
きません。

質問者さんが言う、

> 同じイベントを走らせると、先ほど見えなかった情報(セッション変数、DB共)
> が嘘のように見えるようになっています。

というのは、(1) で起動した子画面で Session 設定後、親画面でもう一度ボタン
クリックしてポストバックし、btnXXX_Click を動かしたということでしょうが、
その時点ではすでに Session は設定済みなので、「嘘のように見える」というこ
とになったのでしょう。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -