1

これが私の Controller のコード スニペットです。すべては、私の Index から始まります。

 public ActionResult Index(...){
       //some code here
       return GenerateReport(...);
    }

これまでのところ... exporter.GenerateReport()は、生成されたExcelファイルの正しいパスを返します...

public ActionResult GenerateReport(...){
      string pathOfGeneratedFile = exporter.GenerateReport(...);
      return DownloadFile(pathOfGeneratedFile, "application/vnd.ms-excel");
}


public FileResult DownloadFile(string filePath, string contentType = "application/octet-stream"){
         return File(filePath, contentType, Path.GetFileName(filePath)); 
}

途中で実際にエラー/例外は発生していません....しかし、ファイルが生成されたらダウンロードできると思っていました... OpenXMlを使用して生成されたファイルを手動で開き、すべての情報が保存されましたそこの...

これが私のビューです... GenerateReportユーザーアクションを反映するためにボタンの値を解析しました....これはインデックスアクションに送信され、生成ボタンをクリックするとユーザーアクションが決定されます...

<input class="btn btn-primary pull-right" type="submit" value="Generate Report" name="userAction"/>

編集:私はこれを私の見解でも使用しました...

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "recordList", InsertionMode = InsertionMode.Replace }))

ところで、すべての操作が完了すると...ビューにガベージ値が表示されます。ファイルをダウンロードしたいだけです。ありがとうございました。

4

1 に答える 1

2

ファイルをダウンロードできない理由は、AJAX 非同期要求を使用しているためです。AJAX 応答にファイルのダウンロードを含めることはできません。コントローラーで次のようなことを試すことができます。

public ActionResult Index(...) {
    var fileName = GenerateReport();

    // store the file name somewhere on the server - do NOT pass it through the URL.
    this.TempData["DownloadFileName"] = fileName;
    this.TempData["DownloadContentType"] = "application/vnd.ms-excel";
    this.TempData.Keep("DownloadFileName");
    this.TempData.Keep("DownloadContentType");

    return new JavaScriptResult() { Script = "document.location = \"" + this.Url.Action("Download") + "\";" };
}

public ActionResult Download() {
    return File((string)this.TempData["DownloadFileName"], (string)this.TempData["DownloadContentType"], Path.GetFileName(filePath)); 
}

したがって、AJAX リクエストはリダイレクトになります (ブラウザが AJAX リクエスト内でリダイレクトされるため、RedirectToAction は使用できません)。このリダイレクトは、従来のリクエストでファイルをダウンロードするようブラウザに指示します。

于 2012-11-15T09:01:57.010 に答える