Первое, что вам следует знать, это то, что AJAX POST не предназначен для выполнения действий по загрузке файлов.Вы можете создать контроллер с методом GET для загрузки файла, сгенерированного из ExecuteReport
:
[HttpGet]
public FileContentResult Download(string fileName)
{
var data = TempData["CSVFile"] as ...; // specify the type returned by ExecuteReport here
if (data != null && !string.IsNullOrEmpty(fileName))
{
fileName = fileName + ".csv";
return File(data, "text/csv", fileName);
}
else
{
// something went wrong
return new EmptyResult();
}
}
Затем в свой вызов AJAX включите функцию success
для перенаправления в контроллер, указанный выше, используя имя файла в качестве параметра и используйтеTempData
/ Session
переменная для передачи содержимого файла:
AJAX POST
function submitForm() {
var form = $('#form');
var obj = {};
// create object to pass into action parameter
console.log(obj);
$.post("ReportExecution", { reportId: @ViewBag.ReportId, parameters: JSON.stringify(obj) }, function (result) {
location.href = '@Url.Action("Download", "ControllerName")' + '?fileName=' + result;
});
}
POST action
[HttpPost]
public ActionResult ReportExecution(int reportId, string parameters)
{
var paramDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(parameters);
var data = this._reportsRepository
.ExecuteReport
(
reportId,
paramDictionary
);
// pass file content to TempData or Session variable
TempData["CSVFile"] = data;
string fileName = "CsVExport";
// pass file name to redirect into download action
return Json(fileName);
}