2011-01-03 13 views
0

私はASP.NET Webフォームアプリケーションを持っています。ドキュメントに生成され、ブラウザに戻されるサーバープロセスへのパラメータとしてフォーム上のフィールドを(検証後に)使用するサーバーにポストバックするボタンが必要です。私は、フォームをいくつかのステータス結果で更新したい。ASP.NET Webフォームでストリームドキュメントを使用して新しいウィンドウを開く方法

これを達成する最も良い方法は何ですか?今、私はボタンをクリックしてドキュメントを生成し、それをブラウザに戻してストリーミングします(Wordドキュメントで、ダイアログがポップアップし、Wordドキュメントは正常に開くことができます)が、ページは更新されません。

私のソリューションではjQueryを使用しているため、jsを使用することは問題がありません。

答えて

1

これは私が思ったよりも難しいことでした。主な問題は、Word文書の新しいブラウザウィンドウを開くことです。ウィンドウが一時的に点滅してから閉じ、Word文書は表示されません。それはセキュリティの問題のようです。

私のページ上のボタンをクリックすると、応答としてWord文書をストリーミングできます。ブラウザのダイアログが開くので、開く/保存/キャンセルできますが、私のページは更新されません。

私の最終的な解決策は、ボタンのクリックでクライアントスクリプトを使用して、フォームのターゲットを一時的に_blankに設定することでした。これは、(ダウンロードダイアログが却下された後に自動的に閉じ)新しいブラウザウィンドウに行くためのポストバックのクリックに応じを強制的に次のように

<asp:Button Text="Generate Doc" runat="server" ID="btnGenerateDoc" 
onclick="btnGenerateDoc_Click" OnClientClick="SetupPageRefresh()" /> 

マイSetupPageRefresh機能は次のとおりです。

function SetupPageRefresh() { 
    // Force the button to open a new browser window. 
    form1.target = '_blank'; 

    // Immediately reset the form's target back to this page, and setup a poll 
    // to the server to wait until the document has been generated. 
    setTimeout("OnTimeout();", 1); 
} 

次に、私のOnTimeout関数はフォームのターゲットをリセットし、サーバープロセスが完了するまで待つようにWebサービスのポーリングを開始します。 (私は、プロセスが完了すると、私は更新私のセッションでカウンターを持っています。)

function OnTimeout() { 
    // Reset the form's target back to this page (from _blank). 
    form1.target = '_self'; 

    // Poll for a change. 
    Poll(); 
} 

そして、ポーリング機能は、単に自分のWebサービスをポーリングするためにjQueryのAJAX機能を使用しています。

function Poll() { 
    var currentCount = $("#hidCount").val(); 
    $.ajax({ 
     url: "/WebService1.asmx/CheckCount", 
     data: JSON.stringify({ currentCount: currentCount }), 
     success: function (data) { 
      var changed = data.d; 
      if (changed) { 
       // Change recorded, so refresh the page. 
       window.location = window.location; 
      } 
      else { 
       // No change - check again in 1 second. 
       setTimeout("Poll();", 1000); 
      } 
     } 
    }); 
} 

だから、これはありませんセッションのカウンタがページ上の非表示フィールドの値から変更されるのを待っている、Webサービスへの1秒間のポーリング。これは、サーバープロセスがWord文書の生成(およびデータベースの更新など)にどれくらいの時間を要しても、ページは完了するまで更新されません。

trueを返してWebサービスコールが戻った場合、ページはwindow.location = window.location文でリフレッシュされます。完全のために

、私のWebサービスは、次のようになります

/// <summary> 
/// Summary description for WebService1 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class WebService1 : WebService 
{ 
    [WebMethod(EnableSession=true)] 
    public bool CheckCount(int currentCount) 
    { 
     if (Session["Count"] == null) 
      Session["Count"] = 0; 
     var count = (int)Session["Count"]; 
     var changed = count != currentCount; 

     return changed; 
    } 
} 

うまくいけば他の誰かを助けること!

1

私は自分のサーバで非常に似た処理をしています。私が処理した方法は、ライブストリームを行うのではなく、サーバ上に一時的な文書を作成することです。それは整理するためのハウスキーピングコードを必要としますが、生成結果を返すことができ、成功した場合には生成されたドキュメントへのクライアント側のリダイレクトを行うことができます。私の場合、jQueryとAJAXを使用してドキュメントの生成とページの更新を行っていますが、WebFormsの純粋なアプローチにも同じ原則を適用する必要があります。

関連する問題