質問するログイン新規登録

回答編集履歴

4

追記&訂正

2019/03/02 03:27

投稿

退会済みユーザー
answer CHANGED
@@ -121,4 +121,4 @@
121
121
 
122
122
  ボタンは input type="submit" なので、その後 form が WebForm2.aspx に submit されます。
123
123
 
124
- Firefox ではその時点での WebForm1.aspx の html ソースがキャッシュされるようで、それが、evin101 さんの言われる「JavaScript オブジェクト状態の保存」ということであろと思います。
124
+ Firefox ではその時点での WebForm1.aspx の html ソースがキャッシュされるようで、それが、evin101 さんの言われる「JavaScript オブジェクト状態の保存」ということでしょか・・・

3

追記

2019/03/02 03:27

投稿

退会済みユーザー
answer CHANGED
@@ -41,4 +41,84 @@
41
41
 
42
42
  なぜ Firefox でこんなことになるのかは調べてないので分かりません。WebFrom1 の初期画面からのポスト先が WebForm2 だったから書き換えてやろうという「小さな親切大きなお世話」ってやつかもしれませんね。
43
43
 
44
- クロスページポストバックを使わないで、普通に WebForm1 のボタンクリックのイベントハンドラで WebForm2 へリダイレクトし、ID は Session またはクエリ文字列で渡すというようにした場合はどうなんでしょう? たぶん問題ないと思いますが、未確認です。
44
+ クロスページポストバックを使わないで、普通に WebForm1 のボタンクリックのイベントハンドラで WebForm2 へリダイレクトし、ID は Session またはクエリ文字列で渡すというようにした場合はどうなんでしょう? たぶん問題ないと思いますが、未確認です。
45
+
46
+ **【追記2】**
47
+
48
+ くどいようですが、原因についてさらに調べましたのでその結果を追記しておきます。興味がありましたら見ていただけると幸いです。
49
+
50
+ 自分が調べた限りですが、要するに、IE, Chrome と Firefox ではキャッシュするタイミングに違いがあって、IE, Chrome は初期画面の、Firefox はユーザーが操作して JavaScript が動いた後の html ソースをキャッシュするという違いが今回の問題の原因になっているようです。
51
+
52
+ 詳しくは以下の通りです。
53
+
54
+ クロスページポストバックを行うために Button に PostBackUrl="WebForm2.aspx" と設定すると、その Button からレンダリングされる input 要素は以下のようになります。type 属性が submit であることと onclick 属性に設定されたスクリプトに注意してください。
55
+
56
+ ```
57
+ <input name="ListView1$ctrl0$Button1"
58
+ id="ListView1_Button1_0"
59
+ onclick='javascript:WebForm_DoPostBackWithOptions(
60
+ new WebForm_PostBackOptions("ListView1$ctrl0$Button1", "", false, "",
61
+ "WebForm2.aspx", false, false))'
62
+ type="submit"
63
+ value="ジャンプ">
64
+
65
+ ```
66
+
67
+ onclick 属性に設定されている WebForm_DoPostBackWithOptions メソッドとその引数の WebForm_PostBackOptions は、HTTP ハンドラ WebResource.axd を使って埋め込みリソースから取得される js ファイルに含まれていて、以下の通りです。
68
+
69
+
70
+ ```
71
+ function WebForm_PostBackOptions(eventTarget, eventArgument, validation,
72
+ validationGroup, actionUrl, trackFocus, clientSubmit) {
73
+ this.eventTarget = eventTarget;
74
+ this.eventArgument = eventArgument;
75
+ this.validation = validation;
76
+ this.validationGroup = validationGroup;
77
+ this.actionUrl = actionUrl;
78
+ this.trackFocus = trackFocus;
79
+ this.clientSubmit = clientSubmit;
80
+ }
81
+
82
+ function WebForm_DoPostBackWithOptions(options) {
83
+ var validationResult = true;
84
+ if (options.validation) {
85
+ if (typeof(Page_ClientValidate) == 'function') {
86
+ validationResult = Page_ClientValidate(options.validationGroup);
87
+ }
88
+ }
89
+ if (validationResult) {
90
+ if ((typeof(options.actionUrl) != "undefined") &&
91
+ (options.actionUrl != null) && (options.actionUrl.length > 0)) {
92
+ theForm.action = options.actionUrl;
93
+ }
94
+ if (options.trackFocus) {
95
+ var lastFocus = theForm.elements["__LASTFOCUS"];
96
+ if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {
97
+ if (typeof(document.activeElement) == "undefined") {
98
+ lastFocus.value = options.eventTarget;
99
+ }
100
+ else {
101
+ var active = document.activeElement;
102
+ if ((typeof(active) != "undefined") && (active != null)) {
103
+ if ((typeof(active.id) != "undefined") &&
104
+ (active.id != null) && (active.id.length > 0)) {
105
+ lastFocus.value = active.id;
106
+ }
107
+ else if (typeof(active.name) != "undefined") {
108
+ lastFocus.value = active.name;
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ }
115
+ if (options.clientSubmit) {
116
+ __doPostBack(options.eventTarget, options.eventArgument);
117
+ }
118
+ }
119
+ ```
120
+ validation, trackFocus, clientSubmit は、上のボタンの onclick 属性に設定されたスクリプトで false に設定されるので、結局 ```theForm.action = options.actionUrl;``` だけの動作とななります。(即ち、form 要素の action 属性が WebForm2.aspx に書き換えられるだけ。theForm はインラインスクリプトとして定義されます)
121
+
122
+ ボタンは input type="submit" なので、その後 form が WebForm2.aspx に submit されます。
123
+
124
+ Firefox ではその時点での WebForm1.aspx の html ソースがキャッシュされるようで、それが、evin101 さんの言われる「JavaScript オブジェクト状態の保存」ということであろうと思います。

2

追記&訂正

2019/03/02 03:11

投稿

退会済みユーザー
answer CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
  ブラウザの「戻る」ボタンで目的のページをキャッシュから取得するのは、ASP.NET Web Forms アプリのデフォルトの設定では、IE も Chrome も Firefox も同じです。
29
29
 
30
- 下の画像は Firefox 65.0.1 と IE11 で、(1) 質問で言う WebForm1 を表示、(2)[ジャンプ]ボタンクリックで WebForm2 へクロスポストバック、(3) ブラウザの[戻る]ボタンで WebForm2 に戻すという操作の要求・応答を FIddler で見たものです。
30
+ 下の画像は Firefox 65.0.1 と IE11 で、(1) 質問で言う WebForm1 を表示、(2)[ジャンプ]ボタンクリックで WebForm2 へクロスページポストバック、(3) ブラウザの[戻る]ボタンで WebForm1 に戻すという操作の要求・応答を Fiddler で見たものです。
31
31
 
32
32
  ![イメージ説明](fddc6202aa1a6b184c4cf0b8c4e500e7.jpeg)
33
33
 

1

追記

2019/03/01 04:09

投稿

退会済みユーザー
answer CHANGED
@@ -17,4 +17,28 @@
17
17
 
18
18
  上の質問に対するコメントにも書きましたが、PostBackUrl(クロスページポストバック)はいろいろ問題が多く、個人的には絶対に使わないようにすべきと思っています。
19
19
 
20
- 解決策はクロスページポストバックの使用を避ける方向で検討すべきと思います。たとえば、WebForm1 のボタンクリックのイベントハンドラで WebForm2 へリダイレクトする。ID は Session またはクエリ文字列で渡すというように。
20
+ 解決策はクロスページポストバックの使用を避ける方向で検討すべきと思います。たとえば、WebForm1 のボタンクリックのイベントハンドラで WebForm2 へリダイレクトする。ID は Session またはクエリ文字列で渡すというように。
21
+
22
+ **【追記】**
23
+
24
+ evin101 さんの回答に対する 2019/03/01 10:34 の私のコメントで「調べた画像を私の回答欄に貼っておきます」と書きましたが、その画像を貼って若干の説明を追記しておきます。
25
+
26
+ **注**:画像のページの名前は WebForm1 ⇒ 0065-PostBackUrlFormA、WebForm2 ⇒ 0065-PostBackUrlFormB に変えてますので注意してください。
27
+
28
+ ブラウザの「戻る」ボタンで目的のページをキャッシュから取得するのは、ASP.NET Web Forms アプリのデフォルトの設定では、IE も Chrome も Firefox も同じです。
29
+
30
+ 下の画像は Firefox 65.0.1 と IE11 で、(1) 質問で言う WebForm1 を表示、(2)[ジャンプ]ボタンクリックで WebForm2 へクロスポストバック、(3) ブラウザの[戻る]ボタンで WebForm2 に戻すという操作の要求・応答を FIddler で見たものです。
31
+
32
+ ![イメージ説明](fddc6202aa1a6b184c4cf0b8c4e500e7.jpeg)
33
+
34
+ 上の画像の #22 が Firefox での (1)、#27 が (2) です。画像の #59 が IE での (1)、#64 が (2) です。(3) の操作では Firefox も IE も要求は出ていません。画面は WebForm1 に戻るのでキャッシュから取得しています。
35
+
36
+ Firefox で (3) の操作の後にキャッシュから取得して表示された html ソースを見ると、以下の画像のように form 要素の action 属性が (2) でクロスページポストバックを行った先に(質問者さんの場合 WebForm2、私の場合は 0065-PostBackUrlFormB)に書き換えられてます。
37
+
38
+ ![イメージ説明](869676b7cafc624456fb575e1866e285.jpeg)
39
+
40
+ これが Firefox を使った場合に起こる問題の原因です。IE, Chrome の場合は書き換えられるようなことはありません。
41
+
42
+ なぜ Firefox でこんなことになるのかは調べてないので分かりません。WebFrom1 の初期画面からのポスト先が WebForm2 だったから書き換えてやろうという「小さな親切大きなお世話」ってやつかもしれませんね。
43
+
44
+ クロスページポストバックを使わないで、普通に WebForm1 のボタンクリックのイベントハンドラで WebForm2 へリダイレクトし、ID は Session またはクエリ文字列で渡すというようにした場合はどうなんでしょう? たぶん問題ないと思いますが、未確認です。