2012-10-25 3 views
11

をdowloadedされ、私は、動的に生成されたファイルをダウンロードし、コントローラのアクションを持っていますfile(myfile.xml)がダウンロードされます。
ただし、「ダウンロード済み」というメッセージはブラウザに送信されません。私はreturn Redirect("www.something.com");
ためreturn Content("Downloaded");
を交換する場合リダイレクト/ショービューが

は同様に、ブラウザは、ファイルのダウンロードの前にリダイレクトされます。プリアンブルのビットとして

は、ユーザーの旅は次のとおりです。

  • ユーザーは
  • フォームが
  • XMLが生成され
  • 提出される前のビューにフォームに記入し、
  • ユーザーがダウンロードしましたリダイレクト/「ダウンロード済み」ビューはと表示されます(F5を押すとフォームは再掲載されません)

答えて

7

各HTTPリクエストには1つのレスポンスしかありません.2つ(ファイルとページ)に潜入しようとしています。

通常、 "Content-Disposition:attachment" HTTPヘッダーを送信すると、ブラウザは現在のページに残り、ファイル保存ダイアログをポップアップします(またはダウンロードしたファイルを自動的に保存します)。

フォームの再提出を防止するには、戦略を変更する必要があります。私は、フォームの送信ボタンを無効にし、divオーバーレイに "Completed"メッセージを表示するJavaScriptのビットをお勧めしますか?

9

ロス氏によると、HTTPリクエストに対して1つの応答しか返せません。私はそのような場合には何 は次のとおりです。

  1. は、サーバーのサーバーは、いくつかのサーバー側のデータ構造内のファイルと格納発生
  2. (キャッシュ、Usersessionを、TempDataを)
  3. サーバーにリクエストを送りますRedirectToAction()(POSTは、GET、パターンをリダイレクト)
  4. リダイレクトアクションが
  5. を送る特別なダウンロードのアクションにwindow.location.hrefプロパティを設定することで、事前生成ファイルのダウンロードをトリガし、一部JavaScriptを使用してビューを返しますファイルをブラウザに戻します。
5

ファイルをダウンロードした後のリダイレクト方法は次のとおりです。 主なロジックは、ファイルがダウンロードされるまでリダイレクトを待機することです。 これを行うには、サーバー側の応答が計算され、サーバー側の応答時間+一部のオフセットを使用してリダイレクトが遅延されます。

サーバー側のコントローラコード:

[HttpPost] 
public ActionResult GetTemplate() 
    { 
     return Json(new {Url = Url.Action("ReturnTemplate") }); 
    } 

[HttpGet] 
public ActionResult ReturnTemplate() 
    { 
     FileResult fileResult = // your file path ; 
     return fileResult; 
    } 

クライアント側コード:

<div id="btnGen" align="right"><button class="main-button"  id="generateTemplate" type="Submit"></div> 

Javascriptを:

$("#generateTemplate").click(function() { 
    var startTime = (new Date()).getTime(), endTime; 

     $.ajax({ 
      url: '@Url.Action("GetTemplate", "Controller")', 
      type: 'POST', 
      traditional: true, 
      dataType: "json", 
      contentType: "application/json", 
      cache: false, 
      data: JSON.stringify(), 
      success: function (result) { 
       endTime = (new Date()).getTime(); 
       var serverResponseTime = endTime - startTime + 500; 
       setInterval(function() { Back() }, serverResponseTime); 
       window.location = result.Url; 
      } 
     }); 
}); 

function Back() { 
    window.location = '@Url.Action("Index","Controller")'; 
}