none
ページ遷移した後で内部処理でラベルコントロール等のTextを設定したい。 RRS feed

  • 質問

  • ASP.NET3.5  VS2008

    いつも、お世話になります。

    ボタンを押すと別のページにResponse.Redirect("xxx.aspx",true) で遷移するという一般的な動作なのですが、

    遷移したページのPage_Load内に、各ラベルやテキストボックスに表示する値を取得するロジックを記述しています。

    このロジックは、別サーバーのAPIを呼び出して返り値を取得するという動作です。

    しかし、大量のデータアクセスや集計を伴うAPIですと、返るまでに時間がかかります。

    この場合、遷移する前のページのまま描画待ちになります。

    そこで、先に表示できる値固定のラベル等だけでページ遷移した後で、API処理を行なって順次表示するという

    動作にしたいのですが、何をどうして良いやら見当が付きません。出来るのかどうかも...?

    どなたか御教示ください。御願いします。

    2010年11月8日 7:51

回答

  • 前のスレッドの話では、

    > ちなみに、重たい処理は別のサーバのAPIにリクエストを投げて返り値も待たずに終わり
    > なので、状況を通知する事は無理な気がします。

    ということだったはずですが、PopupYes ボタンクリックでポストバックして、そのイベン
    トハンドラで、

    > 別のページにResponse.Redirect("xxx.aspx",true) で遷移

    して、遷移先の Page_Load で処置するということにになったのでしょうか? であれば、
    そのあたりを考え直す余地はありませんか?

    たとえば、Response.Redirect("xxx.aspx",true) するのではなく、そこで「重たい処理」
    を非同期ポストバックで実行し、先にも提案したように、UpdateProgress クラスを利用
    して状況をユーザーに通知するとともに、キャンセルする手段を与えるほうがユーザビリ
    ティがよいと思うのですが。
     
    UpdateProgress クラス
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.updateprogress(v=VS.90).aspx


    もう後戻りができないのであれば、Page_Load では「重たい処理」を実行せず、まず軽い
    部分のみレンダリングし、その後ポストバックをかけてそのハンドラで「重たい処理」を
    実行し、結果を表示するという手段にならざるを得ないと思います。

    「その後ポストバックをかけて」という部分は、例えば隠しボタンなどを設けて、それを
    window.onload イベントなどで JavaScript を使ってクリックするといった方法が考えら
    れます。

    ASP.NET AJAX Extionsion の UpdatePanel と、先にも提案した UpdateProgress クラス
    を利用するのがよさそうです。

    検討してみてください。

    • 編集済み SurferOnWww 2010年11月8日 13:02 誤記訂正
    • 回答としてマーク マリカ 2010年11月9日 1:17
    2010年11月8日 13:01

すべての返信

  • 遷移先のページに表示するデータを、JavaScript を使って非同期に取得する、というのはどうでしょうか。

    『ASP.NET Ajax』のキーワードで検索すれば、サンプルも見つかると思います。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年11月8日 8:13
  • なかむら様、御返事ありがとうございます。

    やはり、Javaで作り込まないと無理ですか...!?

    API呼び出しロジックは、既にC#で出来上がっているので、このまま使いたいです。

    私は、JavaScriptが良く分かっていないし検索しましたが見当もつきません。

    何となく、UpdatePanelとTimerの組み合わせで出来そうな気がします。

    他に良い方法が有れば、教えてください。

     

     

    2010年11月8日 8:40
  • # 細かいですが、Java と JavaScript は全くの別物ですので、ご注意ください。Java で作りこむことはありません。

    今の仕組みを可能な限り生かしたいということであれば、UpdatePanel を使うのが手っ取り早いのではないでしょうか。

     ・処理が遅くなるデータを表示するコントロールは UpdatePanel の中に入れてしまう。(デザイン)
     ・ページ遷移時には C# の API を呼ばない。(サーバー側)
     ・ページをロードしたら非同期ポストバックする JavaScript を埋め込む。(クライアント側)
     ・非同期ポストバック時には C# の API を呼ぶ。(サーバー側)

    マリカさんの今までのスレッドの中に材料は揃っているように思うのですが。
    他の参考:
     How to refresh an UpdatePanel from javascript
     http://codeclimber.net.nz/archive/2007/06/26/how-to-refresh-an-updatepanel-from-javascript.aspx

    あるいは、C# の API はそのままに Web サービス化しておいて、より Ajax 度を増す方法もあります。(こちらが正攻法か)

     ・C# の API を呼び出してデータを整形(XML とか JSON とか)するサービスを作る。(サーバー側)
     ・ページ遷移時には C# の API を呼ばない。(サーバー側)
     ・処理が遅くなるデータを表示するコントロールは jQuery とかの部品にしてしまう。(デザイン)
     ・ページをロードしたら Web サービスを呼び出して、返ってきたデータをコントロールに張り付ける JavaScript を埋め込む。(クライアント側)

    JavaScript のコード量は増えますが、より自然な UI にはなります。
    2010年11月8日 10:26
  • 前のスレッドの話では、

    > ちなみに、重たい処理は別のサーバのAPIにリクエストを投げて返り値も待たずに終わり
    > なので、状況を通知する事は無理な気がします。

    ということだったはずですが、PopupYes ボタンクリックでポストバックして、そのイベン
    トハンドラで、

    > 別のページにResponse.Redirect("xxx.aspx",true) で遷移

    して、遷移先の Page_Load で処置するということにになったのでしょうか? であれば、
    そのあたりを考え直す余地はありませんか?

    たとえば、Response.Redirect("xxx.aspx",true) するのではなく、そこで「重たい処理」
    を非同期ポストバックで実行し、先にも提案したように、UpdateProgress クラスを利用
    して状況をユーザーに通知するとともに、キャンセルする手段を与えるほうがユーザビリ
    ティがよいと思うのですが。
     
    UpdateProgress クラス
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.updateprogress(v=VS.90).aspx


    もう後戻りができないのであれば、Page_Load では「重たい処理」を実行せず、まず軽い
    部分のみレンダリングし、その後ポストバックをかけてそのハンドラで「重たい処理」を
    実行し、結果を表示するという手段にならざるを得ないと思います。

    「その後ポストバックをかけて」という部分は、例えば隠しボタンなどを設けて、それを
    window.onload イベントなどで JavaScript を使ってクリックするといった方法が考えら
    れます。

    ASP.NET AJAX Extionsion の UpdatePanel と、先にも提案した UpdateProgress クラス
    を利用するのがよさそうです。

    検討してみてください。

    • 編集済み SurferOnWww 2010年11月8日 13:02 誤記訂正
    • 回答としてマーク マリカ 2010年11月9日 1:17
    2010年11月8日 13:01
  • totojo様、SurferOnWww様、いつも有難うございます。

    今回のは、前のスレッドとは別件でした。

    結局、知りたかったのは、Page_Loadの後で自動でPostBackさせる方法です。

    >「その後ポストバックをかけて」という部分は、例えば隠しボタンなどを設けて、それを
    >window.onload イベントなどで JavaScript を使ってクリックするといった方法が考えら
    >れます。

    なるほど!非表示のコントロールを使うという手がありましたか。思い付きませんでした。

    UpdateProgressも検討しましたが、いまいち使い方が判らず断念しました。

    結局、自分なりに思い付いたUpdataPanel+Timerで動作しています。

    御世話になりました。

    2010年11月9日 1:17