0

ASP.NET MVC3 アプリケーションを開発しています。ファイルダウンロード用のコントローラーがあります:

public ActionResult PDF(string id)
{
    try
    {
        // here I unzip a file, DownName comes from here

        Response.Clear();
        Response.AddHeader("Content-Disposition", 
                           "attachment; filename=" + id + ".pdf");
        Response.ContentType = "application/pdf";
        Response.WriteFile(DownName);
        Response.Flush();
        Response.Close();
        System.IO.File.Delete(DownName);
        return View();
    }
    catch (Exception)
    {
        message = "File not found.";
    }

    return Json(new { message = message }, JsonRequestBehavior.AllowGet);
}

クライアント側では、この PDF ファイルを取得する必要があります。ただし、ファイルが見つからない場合は、「ファイルが見つかりません」などのテキストで警告します。私は多くの方法を試しましたが、最終的にこれになりました:

$(function(){
  $(".pdf").click(function(e) {
    e.preventDefault();
    $.post("@Url.Action("PDF","Helper")",{id : $(this).data("id")},function(data){
      if(data.message == "File not found.") {
        alert(data.message);
      } else {
        alert(data);
      }
    });
  });
});

ファイルが見つからない場合は、エラー メッセージを正常に警告できます。ここにあるデータの保存ダイアログ ボックスを開くにはどうすればよいですか? コントローラーで作業できる他の方法も高く評価されます。

編集:次のようにコントローラーを呼び出すと、ファイルを簡単にダウンロードできます。

<a href="../../Helper/PDF/@Model.ID">Download PDF</a>

ただし、この結果がファイルと JSON でない場合、ページは JSON オブジェクトを表示する空白のページにリダイレクトされます。前に言ったように、画面にアラートを出したいです。この方法での回避策もありがたいです。

4

1 に答える 1

3

アクションから FileResult を返す必要があります。そうしないと、ブラウザにファイルをダウンロードするように指示できません。JavaScript を使用した非同期リクエストでファイル データをリクエストする場合、ブラウザを起動してそのデータをローカル ファイルに保存することはできません。

ファイルの存在を確認できるようにする必要がある場合は、次の 2 つのアクションを提供する必要があります。

public JsonResult PDFAvailable(string id) {
    // check if the file is there
    return Json(new { message = message }, JsonRequestBehavior.AllowGet);
}

public FileResult PDF(string id) {
    // get the filedata
    byte[] fileData = ...;
    return File(fileData, "application/pdf");
}

ビューで、PDFAvailable アクション ID でファイルが存在することを確認します。メッセージが表示されない場合は、通常のリクエストで PDF アクションを呼び出します。

window.location.href = 
     '@Url.Action("PDF", "YourController", new { id = "yourFileId" })';

編集

クロムと設定の問題についてlocation.href:これはクロムで確実に機能します。テストを行うだけです。次の内容の html ファイルを作成します。

<script>
    location.href = "http://www.google.com";
</script>

そしてそれをクロムで開きます。ブラウザを Google ホームページにリダイレクトする必要があります。その場合、コードには他の問題があります。そうでない場合は、使用しているクロムのバージョンを教えてください。

于 2013-05-07T10:51:45.590 に答える