それもChatGPT!?と驚いた使用方法を教えてください

ブラウザ画面で、変更した値が元に戻る場合が時々あり、困っています。

お世話になります。

あるクライアントで、画面で値を変更して登録ボタン押します。
実行確認ダイアログでOKを入力します。
次に登録しましたの確認ダイアログ表示します。
この時、画面で変更した値が元の値に戻って表示されます。
この現象は、毎回発生する訳でなく時々発生します。
(現象が発生するクライアントは、何台もあります。OSのバージョンも違えば、
IEのバージョンも違います)

今は、原因がクライアントPC側か、プログラム側かも判りません?

プログラム側は、DB更新するSQL文を見る限り画面の値が元の値で更新しています。
SQL文の値は、データテーブルよりセットしています。
データテーブルの値は、ポストバックのタイミングで、画面よりセットしています。
この時のBeginEditとEndEditが悪いのか?
または、クライアント側のIEの設定に問題があるのか?

サーバはwin2003(SP2)+IIS6+oracle9i
クライアントはWinXp+IE8等、いろいろ
VS2005です。

以上、よろしくお願い致します。

A 回答 (3件)

う~ん、いまひとつよくわからないのですが、なかなか非情な実装ですねえ。



親画面から子画面(JavaScript別窓?)をQueryStringつきで開き、子画面Load時にパラメタ拾ってデータを読み画面表示する。

子画面側のformから、親画面へのurlをアクションにしてsubmit

親画面がLoadされたときに遷移先をRequestから取って、子画面経由であればそのRequest内容を拾ってフォームに反映

親画面の登録ボタン押す

登録確認ダイアログ表示

登録完了ダイアログ表示

ということだとすると、親画面が子画面から呼び出されて再Loadされたときに、Request判定している時点でコケてますね。
Page_Load時点でのRequestオブジェクト内容をデバグしてみてください。

自分思うに、一番ありそうな話は、ページがキャッシュ状態で開かれてしまい、内容が書き換わらないことです(親画面は開きっぱなしのようなので)。
特に子画面から短時間で登録すると、ブラウザの「リロード」ボタンと同じことになります。
ちゃんとPege_Loadイベントも起きていないかもしれません。

もしそうなら、対策は、親画面中のページディレクティブやMETAタグに、キャッシュ忌避用のパラメタを打ちまくるか、いったん別画面を経由させて親画面をLoadさせることです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
また、返信が遅くなり大変申し訳ありません。

こちらの質問内容や現象説明に間違いがありました。整理しておきます。

お客様環境で、ほとんどのPCで入力した内容が、時々元の値に戻る場合がある。
社内の環境では、1台のみ発生し頻度も10回に1回程度、他の4台のPCでは発生しない。

画面の構成は、フレームで上部がメニュー的な作りで、画面切り替えとDBへの更新ボタンあり。←前はこれを親画面と書きました。
下部が各画面です(6画面あり)。←前回は、これを子画面と書きました。すみません。

現象は、下部の各画面で入力した内容が上部のDB更新ボタンを押した時に、元の値戻ってしまう現象です。

後、最近分かった事として別サーバでは、再現しないと。

その為、今からサーバのIISの設定の違いや本当に同じプログラムが動いているか調べて行きたいと思います。

以上、ありがとうございました。

お礼日時:2010/08/05 18:11

AjaxとかMVCとか、状況がよくわからないのですが、



値を変更して登録ボタン押す
 ↓
実行確認ダイアログ出す(onClientClickで出してます?)
 ↓
OKボタン押す
 ↓
サーバへフォーム送信される
 ↓
pageLoadイベント発生
 ↓
ボタン等のイベントハンドラ発生
 ↓
ブラウザがページを描画
 ↓
登録しました確認ダイアログ表示(JavaScript)

という通常のASP.NET Webフォームの流れなら、ポストバックでは、前画面のサーバコントロール値は、必ず再現されなければいけません。でなければMS倒産(笑
この際JavaScriptは関係ないと思われます。

それが不可能ということは、何か間違っています。
・サーバコントロールではない
・そのサーバコントロールのPostBackを明示的にfalseにしている
・サーバコントロールが動的に追加されたもの

また、値を取り出す場所を間違えている場合もあります。
ポストバックは<asp:button>とか<asp:linkbutton>で行っていると思いますので、正しくそのボタンイベントハンドラ内で値を取り出しているか確認してください。
ポストバック後であっても、initイベントやpreloadイベントでは、タイミングによって値がセットされません。

この回答への補足

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

説明不足ですみません。
Ajaxは未使用、MVCは(良く判っていませんが、たぶん)未使用です。
後、よくプログラムを見ると、画面へ表示して入力するテキスト(子画面)とDB更新するボタン
(親画面)は別フォームでした。
親画面に子画面切り替えするリンクあります。
データセットは2つ、子画面は6画面です。
子画面のPage_Loadで、データセットより画面上の項目へデータ転送して表示しています。
親画面のPage_Loadで、Request.HttpMethodとRequest.UrlReferrer.ToString()を使って、
どの画面より、イベントが来たかで、移動元子画面の項目の値をデータセットへ転送しています。

障害発生するタイミングは、子画面で値変更し、親画面の登録ボタン押し、
登録確認ダイアログ表示(onClientClickではない)し、登録完了ダイアログ表示の際です。

発生する場合と発生しない場合があります。

本番環境で、ほぼ毎回(発生しない場合もあり)、私の居る環境(別会社)では、5台中1台のPCで
10回に1回ほど発生します。

補足日時:2010/07/12 14:52
    • good
    • 0

ポストバックした時に、プログラム内で変更されたデータを明示的にテキストボックスなどに再セットしてあげてはどうでしょうか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ポストバックした時に、前の値に戻っているような気がします。
何が悪いか判別する為に、別のテキストボックスへ値を表示させてみます。
(画面項目数が全部で74項目あって厳しいので、最初は絞り込んだ項目でやってみます)
アドバイスありがとうございました。

お礼日時:2010/07/05 09:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報