3

MVC 3のWebサイトからCSVを生成し、FileContentResultを使用してこれをユーザーに渡します。これは素晴らしかったが、保存するプロンプトがユーザーに与えられる前にcsvが生成されるのに30秒かかり、したがって30秒かかった。MVC FileContentResultをJqueryで呼び出すと、その結果を保存するようにユーザーに促すことができますか?

public virtual FileContentResult GetSpreadsheet(string id) 
    { 
     var service = new SpreadsheetService(); 
     var result = service.GetCSV(); 
     return File(new System.Text.UTF8Encoding().GetBytes(result.Message), "text/csv", "Report123.csv"); 
    } 

だから、私はちょうどjQueryの経由で呼びたいと思った - ちょうどページにCSVをダンプしますが、この(当然!)。

  $.post("/Home/GetSpreadsheet/" + id, null, function (data) { 
       $('#resultDiv').html(data); 
      }); 

どのように私は今すぐ私はデータを持っている保存するプロンプトを生成するだろう知っている?ありがとう

答えて

10

あなたはできません。それを忘れる。 AJAXを使用してファイルをダウンロードすることは不可能です。実際にはAJAXコールが機能し、サーバにヒットし、サーバはファイルの内容をクライアントに返信し、AJAX成功コールバックが起動され、ファイルの内容が引数として渡され、すべてが終了します。 javascriptを使用すると、絶対に明白な理由からファイルをクライアントコンピュータに直接保存することはできず、[名前を付けて保存]ダイアログが表示されなくなります。サーバはブラウザが自分のコンピュータ上でいくつかの選択した場所にファイルをダウンロードして保存するようユーザーに促しますattachmentContent-Dispositionヘッダを設定した場合、今

@Html.ActionLink("download spreadsheet", "GetSpreadsheet", new { id = "123" }) 

:だからではなく、AJAXは、単にアンカーを作成し使用しての

+0

知られている場合は、適切なタイプにコンテンツタイプヘッダーを設定して、ダイアログを開くか保存するかどうかを指定できます(ほとんどの場合)。Content-type:application/vnd.ms-excelまたはtext/csv – Hal

+0

答えが大好きです。私はTherapyの "Screamager"という歌について考えさせてくれました。 – vapcguy

10

アンカーを使用しない場合は、非表示のiframeを使用し、iframeのsrcをダウンロードするファイルのURLに設定します。代わりに '$の.post(...)' 線使用の

<iframe id="hiddenFrame" src="" style="display:none; visibility:hidden;"></iframe> 

downloadSpreadsheet('123'); 

function downloadSpreadsheet(id) { 
    var url = '@Url.Content("~/YourControllerName/GetSpreadsheet")' + "?id=" + id; 
    $('#hiddenFrame').attr('src', url); 
} 

それとも、このプラグインを使用してjQuery Plugin for Requesting Ajax-like File Downloads

に試してみることができ、あなたがダウンロードすることができます

jQuery.download(url, data, method) 
4
あなたはJavaScriptでこれを使用することができます

invockingによって
function downloadSpreadsheet(id) { 
    window.location.href = '@Url.Action("GetSpreadsheet", "Home")?id=' + id; 
} 
関連する問題