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

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

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

Re[4]: Server.Transferによる遷移とAjaxイベント


(過去ログ 116 を表示中)

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

■68246 / inTopicNo.1)  Server.Transferによる遷移とAjaxイベント
  
□投稿者/ fumo (1回)-(2013/10/03(Thu) 20:39:01)

分類:[ASP.NET (C#)] 

【開発環境】
開発OS: Windows 7 SP1
開発.NET Framework: 4.5
Visual Studioのバージョン: 2012
開発言語: C#
使用ブラウザ:Internet Explorer 9

現在、Webフォームによるシステムの開発を行っているのですが、Server.Transferによって遷移した画面でUpdatePanelを利用したAjaxのイベントを実行すると、
その画面の2回目のAjaxイベント発生時に以下のエラーメッセージのエラーが発生します。
(エラーメッセージ ⇒ 0x800a139e - Microsoft JScript 実行時エラー: Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was: 404)


ネットで調べると少しですが同様の現象が発生しているようです。それによると、Responce.Redirectによる遷移にすると解決するとあり、実際試すとエラーは発生しませんでした。
また、検証の結果、Server.Transferで遷移した画面で1度でも通常のポストバックが発生していると、以降はAjaxのイベントが発生してもエラーは発生しないことが判明しました。

ここで質問なのですが、
@Server.Transferによる画面遷移とAjaxのイベントの関連性について。
AServer.Transferによる画面遷移とAjaxのイベントを両立させる方法はないか。

以上の二つについてご教示いただければと思います。

@については今回の現象の原因が知りたい。
Aについては、画面間のデータの受け渡し等のことを考えて、できれば画面遷移はServer.Transferを利用したいと考えているため、Responce.Redirectによる遷移を利用したくない。
ということになります。

皆様お忙しいとは思いますが、よければご教示いただけると助かります。


引用返信 編集キー/
■68247 / inTopicNo.2)  Re[1]: Server.Transferによる遷移とAjaxイベント
□投稿者/ WebSurfer (65回)-(2013/10/03(Thu) 21:28:31)
No68246 (fumo さん) に返信
> Aについては、画面間のデータの受け渡し等のことを考えて、できれば画面遷移はServer.Transferを利用したいと考えているため、Responce.Redirectによる遷移を利用したくない。

そのあたりの理由を詳しく書いてもらえると、お役に立てる回答ができるかもしれません。


引用返信 編集キー/
■68257 / inTopicNo.3)  Re[2]: Server.Transferによる遷移とAjaxイベント
□投稿者/ fumo (2回)-(2013/10/04(Fri) 08:35:43)
No68247 (WebSurfer さん) に返信

返信が遅れまして申し訳ありません。

画面間のデータの受け渡しをするために、遷移後の画面からPreviousPageを利用して遷移前の画面から値を取得しています。
画面の項目が多くなるので、セッションやクエリストリングに一つずつ格納して…といった方式はとりたくないと考えております。
引用返信 編集キー/
■68262 / inTopicNo.4)  Re[1]: Server.Transferによる遷移とAjaxイベント
□投稿者/ PANG2 (11回)-(2013/10/04(Fri) 12:27:03)
No68246 (fumo さん) に返信
> @Server.Transferによる画面遷移とAjaxのイベントの関連性について。

AJAXクライアントが Server.Transfer前のURLを基準に通信するのでは?

> AServer.Transferによる画面遷移とAjaxのイベントを両立させる方法はないか。

クロスページ・ポストバック
http://www.atmarkit.co.jp/fdotnet/dotnettips/409asppostback2/asppostback2.html


参考
http://msmvps.com/blogs/luisabreu/archive/2007/10/10/no-you-cannot-call-server-transfer-on-an-asp-net-ajax-enabled-page.aspx


引用返信 編集キー/
■68263 / inTopicNo.5)  Re[3]: Server.Transferによる遷移とAjaxイベント
□投稿者/ WebSurfer (68回)-(2013/10/04(Fri) 12:55:43)
No68257 (fumo さん) に返信
> ■No68247 (WebSurfer さん) に返信
>
> 返信が遅れまして申し訳ありません。
>
> 画面間のデータの受け渡しをするために、遷移後の画面からPreviousPageを利用して遷移前の画面から値を取得しています。
> 画面の項目が多くなるので、セッションやクエリストリングに一つずつ格納して…といった方式はとりたくないと考えております。

以下のケース(UpdatePanel を配置したページで Server.Transfer を使ってい
る)とは違いますよね? このケースでも 404 エラーになるそうです。もし、
このケースであれば、Response.Redirect を使う以外に現実的な解決策はありま
せん。

No, you cannot call Server.Transfer on an ASP.NET AJAX enabled page
http://msmvps.com/blogs/luisabreu/archive/2007/10/10/no-you-cannot-call-server-transfer-on-an-asp-net-ajax-enabled-page.aspx


上記のケースとは違って、遷移先のページで UpdatePanel を使っているという
ことですか? 例えば、以下のページの図16.2 で、UpdatePanel を使っている
のは sampleB.aspx で、そのページを構築する際 asmpleA.aspx のデータを使用
しているということですか?

そうだとすると、最初に sampleB.aspx から html ソースがブラウザに送信され
た後で、ブラウザが sampleB.aspx に非同期要求を出した時には sampleA.aspx
はサーバーのメモリには存在しないので、sampleB.aspx(これは非同期要求を受
けると再度サーバーのメモリにロードされます)で、asmpleA.aspx のデータを取
得できないのでエラーになるということではないかと思います(想像です)。

ただ、一度通常のポストバック(同期要求と理解)が発生するとエラーが出ないの
はつじつまが合わないですが。


セッションやクエリ文字列を使わない理由は、単にめんどくさいからということ
のようですが、その程度の理由しかないのであれば、普通にセッション等に前画
面のデータを保持し Response.Redirect で遷移することをお勧めします。

ASP.NET Web Forms アプリでの画面遷移は Response.Redirect を使うのが基本で
す。Server.Transfer をつかうのはよほどの理由(例えば、GetLastError メソッ
ドを利用してのエラー処置とか、SEO 対策とか)がない限り止めた方が無難です。

Web アプリケーション開発では、Post/Redirect/Get (PRG) パターンを使うこと
が基本ということもありますし。

Post/Redirect/Get
http://en.wikipedia.org/wiki/Post/Redirect/Get

引用返信 編集キー/
■68264 / inTopicNo.6)  Re[4]: Server.Transferによる遷移とAjaxイベント
□投稿者/ WebSurfer (69回)-(2013/10/04(Fri) 12:58:55)
No68257 (fumo さん) に返信
> 上記のケースとは違って、遷移先のページで UpdatePanel を使っているという
> ことですか? 例えば、以下のページの図16.2 で、UpdatePanel を使っている
> のは sampleB.aspx で、そのページを構築する際 asmpleA.aspx のデータを使用
> しているということですか?

「以下のページの図16.2」と書きましたが、そのページの URL を書くのを忘れて
ました。以下の通りです。

第16回 ASP.NETにおけるページの遷移 (1/4)
http://www.atmarkit.co.jp/ait/articles/0304/05/news003.html
引用返信 編集キー/
■68267 / inTopicNo.7)  Re[2]: Server.Transferによる遷移とAjaxイベント
□投稿者/ fumo (3回)-(2013/10/04(Fri) 14:37:14)
No68262 (PANG2 さん) に返信
> ■No68246 (fumo さん) に返信
>>@Server.Transferによる画面遷移とAjaxのイベントの関連性について。
>
> AJAXクライアントが Server.Transfer前のURLを基準に通信するのでは?
>
>>AServer.Transferによる画面遷移とAjaxのイベントを両立させる方法はないか。
>
> クロスページ・ポストバック
> http://www.atmarkit.co.jp/fdotnet/dotnettips/409asppostback2/asppostback2.html
>
>
> 参考
> http://msmvps.com/blogs/luisabreu/archive/2007/10/10/no-you-cannot-call-server-transfer-on-an-asp-net-ajax-enabled-page.aspx
>
>

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

原因については、そう言われると理解できるようなできないような…といった感じで、自分の中でもう少し理解できるまで考えてみようと思います。

参考のサイトも見させていただきました。
翻訳サイトにかけつつの解釈ですが、参考のサイトの内容は、UpdatePanelを配置したページでServer.Transferを使うとエラーになるということでしょうか。
自分が今問題になっているのはServer.Transferで遷移した先の画面で、UpdatePanelを利用したAjaxイベントが発生した場合ですので、参考サイトとは違うと感じました。
それは自分の認識が間違っているでしょうか、そうでしたら申し訳ありませんが補足説明いただけると助かります。
引用返信 編集キー/
■68269 / inTopicNo.8)  Re[4]: Server.Transferによる遷移とAjaxイベント
□投稿者/ fumo (4回)-(2013/10/04(Fri) 17:07:56)
No68263 (WebSurfer さん) に返信
>
> 以下のケース(UpdatePanel を配置したページで Server.Transfer を使ってい
> る)とは違いますよね? このケースでも 404 エラーになるそうです。もし、
> このケースであれば、Response.Redirect を使う以外に現実的な解決策はありま
> せん。
>
> No, you cannot call Server.Transfer on an ASP.NET AJAX enabled page
> http://msmvps.com/blogs/luisabreu/archive/2007/10/10/no-you-cannot-call-server-transfer-on-an-asp-net-ajax-enabled-page.aspx
>
>
> 上記のケースとは違って、遷移先のページで UpdatePanel を使っているという
> ことですか? 例えば、以下のページの図16.2 で、UpdatePanel を使っている
> のは sampleB.aspx で、そのページを構築する際 asmpleA.aspx のデータを使用
> しているということですか?
>

 はい、おおむねその通りですが、sampleB.aspxでsampleA.aspxの値を使用しなくても(Previous Pageの取得等もしていない)
 同様のエラーは発生します。


> そうだとすると、最初に sampleB.aspx から html ソースがブラウザに送信され
> た後で、ブラウザが sampleB.aspx に非同期要求を出した時には sampleA.aspx
> はサーバーのメモリには存在しないので、sampleB.aspx(これは非同期要求を受
> けると再度サーバーのメモリにロードされます)で、asmpleA.aspx のデータを取
> 得できないのでエラーになるということではないかと思います(想像です)。
>
> ただ、一度通常のポストバック(同期要求と理解)が発生するとエラーが出ないの
> はつじつまが合わないですが。
>

 通常のポストバックでエラーが解消されるのが、確かに一番意味が不明な部分ではありますね。

>
> セッションやクエリ文字列を使わない理由は、単にめんどくさいからということ
> のようですが、その程度の理由しかないのであれば、普通にセッション等に前画
> 面のデータを保持し Response.Redirect で遷移することをお勧めします。
>
> ASP.NET Web Forms アプリでの画面遷移は Response.Redirect を使うのが基本で
> す。Server.Transfer をつかうのはよほどの理由(例えば、GetLastError メソッ
> ドを利用してのエラー処置とか、SEO 対策とか)がない限り止めた方が無難です。
>
> Web アプリケーション開発では、Post/Redirect/Get (PRG) パターンを使うこと
> が基本ということもありますし。
>
> Post/Redirect/Get
> http://en.wikipedia.org/wiki/Post/Redirect/Get

すみません、それ以外にも理由がありまして、

@ブラウザの「戻る」機能を使わせないために、画面遷移ごとにセッション変数へPreviousPageのオブジェクトを画面遷移履歴として保存しておき、画面に実装したボタン
を押下した際に、セッション変数の最新履歴からPathを取得してServer.Transferでひとつ前の画面に遷移、さらに最新履歴から各コントロールを取得して表示されていた
値の復元を行うという機能を実装しているため、PreviousPageを利用したい。
(戻るボタンが利用できると、常に最新のデータを表示しておきたい画面で、キャッシュから復元された古い情報が表示されてしまう可能性がある。)
APostBackUrlを指定した遷移だと、「データ入力画面で保存ボタン押下⇒データ保存(処理)⇒トップ画面に戻る(遷移)」といった処理を一つのイベントで実装できない。
(遷移元画面の処理実行前にPostBackUrlのリンク先に遷移してしまう)

上記2つの理由があるため、Server.Transferで遷移を行いたいと考えております。

(情報が小出しになってしまい申し訳ありません)

Server.TransferとAjaxはうまく使えないものなのでしょうか…。




引用返信 編集キー/
■68271 / inTopicNo.9)  Re[5]: Server.Transferによる遷移とAjaxイベント
□投稿者/ WebSurfer (70回)-(2013/10/04(Fri) 18:50:27)
No68269 (fumo さん) に返信
> @ブラウザの「戻る」機能を使わせないために、画面遷移ごとにセッション変数へPreviousPageのオブジェクトを画面遷移履歴として保存しておき、画面に実装したボタン
> を押下した際に、セッション変数の最新履歴からPathを取得してServer.Transferでひとつ前の画面に遷移、さらに最新履歴から各コントロールを取得して表示されていた
> 値の復元を行うという機能を実装しているため、PreviousPageを利用したい。
> (戻るボタンが利用できると、常に最新のデータを表示しておきたい画面で、キャッシュから復元された古い情報が表示されてしまう可能性がある。)

今頃になって話がぜんぜん違ってきているような気がします。それを最初に書
いておいてもらえたらと思います。

想定外(少なくとも自分には)のことをして、予期しないトラブルが起こって
いるという感じで、このまま進めるということであれば自分には解決策はわか
りません。

お役に立てずすみませんが、他の方の回答をお待ちください。

引用返信 編集キー/
■68272 / inTopicNo.10)  Re[6]: Server.Transferによる遷移とAjaxイベント
□投稿者/ fumo (5回)-(2013/10/04(Fri) 19:05:45)
No68271 (WebSurfer さん) に返信
> ■No68269 (fumo さん) に返信
>>@ブラウザの「戻る」機能を使わせないために、画面遷移ごとにセッション変数へPreviousPageのオブジェクトを画面遷移履歴として保存しておき、画面に実装したボタン
>>を押下した際に、セッション変数の最新履歴からPathを取得してServer.Transferでひとつ前の画面に遷移、さらに最新履歴から各コントロールを取得して表示されていた
>>値の復元を行うという機能を実装しているため、PreviousPageを利用したい。
>>(戻るボタンが利用できると、常に最新のデータを表示しておきたい画面で、キャッシュから復元された古い情報が表示されてしまう可能性がある。)
>
> 今頃になって話がぜんぜん違ってきているような気がします。それを最初に書
> いておいてもらえたらと思います。
>
> 想定外(少なくとも自分には)のことをして、予期しないトラブルが起こって
> いるという感じで、このまま進めるということであれば自分には解決策はわか
> りません。
>
> お役に立てずすみませんが、他の方の回答をお待ちください。
>

質問が下手で申し訳ないです。

エラーの原因等、参考になります。回答、ありがとうございました。
引用返信 編集キー/
■68273 / inTopicNo.11)  Re[3]: Server.Transferによる遷移とAjaxイベント
□投稿者/ fumo (6回)-(2013/10/04(Fri) 19:12:45)
自分の質問を整理したいと思います。

【開発環境】
開発OS: Windows 7 SP1
開発.NET Framework: 4.5
Visual Studioのバージョン: 2012
開発言語: C#
使用ブラウザ:Internet Explorer 9

現在、Webフォームによるシステムの開発を行っているのですが、Server.Transferによって遷移した画面でUpdatePanelを利用したAjaxのイベントを実行すると、
その画面の2回目のAjaxイベント発生時に以下のエラーメッセージのエラーが発生します。
(エラーメッセージ ⇒ 0x800a139e - Microsoft JScript 実行時エラー: Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was: 404)


ネットで調べると少しですが同様の現象が発生しているようです。それによると、Responce.Redirectによる遷移にすると解決するとあり、実際試すとエラーは発生しませんでした。
また、検証の結果、Server.Transferで遷移した画面で1度でも通常のポストバックが発生していると、以降はAjaxのイベントが発生してもエラーは発生しないことが判明しました。

ここで質問なのですが、
@Server.Transferによる画面遷移とAjaxのイベントの関連性について。
AServer.Transferによる画面遷移とAjaxのイベントを両立させる方法はないか。

以上の二つについてご教示いただければと思います。

@については今回の現象の原因が知りたい。
Aについては、以下の3つの理由により画面遷移はServer.Transferを利用したいと考えているため、Responce.Redirectによる遷移を利用したくない。
1.受け渡す値が多いため、それらをすべてセッションやクエリストリング等でやり取りすると、ヒューマンエラーの発生確率が上がってしまうと考えられる。
2.ブラウザの「戻る」機能を使わせないために、画面遷移ごとにセッション変数へPreviousPageのオブジェクトを画面遷移履歴として保存しておき、画面に実装したボタン
を押下した際に、セッション変数の最新履歴からPathを取得してServer.Transferでひとつ前の画面に遷移、さらに最新履歴から各コントロールを取得して表示されていた
値の復元を行うという機能を実装しているため、PreviousPageを利用したい。
(戻るボタンが利用できると、常に最新のデータを表示しておきたい画面で、キャッシュから復元された古い情報が表示されてしまう可能性がある。)
3.PostBackUrlを指定した遷移だと、「データ入力画面で保存ボタン押下⇒データ保存(処理)⇒トップ画面に戻る(遷移)」といった処理を一つのイベントで実装できない。
(遷移元画面の処理実行前にPostBackUrlのリンク先に遷移してしまう)


以上のことについて、なにかご教示いただければ助かります。
引用返信 編集キー/
■68285 / inTopicNo.12)  Re[4]: Server.Transferによる遷移とAjaxイベント
□投稿者/ fumo (7回)-(2013/10/07(Mon) 15:57:43)
自己レスです。

解決策が見つからないため、Responce.Redirectで遷移する方式に切り替える方向で作業を進めることになりました。

回答いただいたWebSurfer 様、PANG2 様、ありがとうございました。


実際には解決できたわけではありませんが、「別の方針をとる」という方向性が定まったため、解決済みとさせていただきます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -