Вы должны знать, что вызов AJAX не предназначен для прямой загрузки файла CSV.Следовательно, вы можете создать байтовый массив из MemoryStream
экземпляра и сохранить его в переменной Session
или TempData
, а затем вернуть «успешное» состояние, чтобы разрешить перенаправление при успешном ответе AJAX:
public ActionResult GetHistoricalUsageApplicationFile([DataSourceRequest]DataSourceRequest request, [FromBody] string accountCodes)
{
var HistoricalUsagesData = _enrollmentManagementRepository.GetHistoricalUsageApplicationFile(accountCodes);
List<HistoricalUsageApplicationFileModel> HUApplications = _mapper.MapToNew<List<HistoricalUsageApplicationFileModel>>(HistoricalUsagesData);
//var HistoricalUsageApplication = HUReport.ToDataSourceResult(request).Data;
var output = new MemoryStream();
var writer = new StreamWriter(output, Encoding.UTF8);
writer.Write("CommodityCode,");
writer.Write("CustomerTypeCode,");
writer.Write("EnrollmentRequestId");
writer.WriteLine();
var list = HUApplications.ConvertToString();
var single = list.Aggregate((x, y) => { return string.Concat(x, y); });
writer.WriteAsync(single);
writer.Flush();
output.Position = 0;
// creates byte array from stream
TempData["Output"] = output.ToArray();
// returns successful state
return Json("Success", JsonRequestBehavior.AllowGet);
}
Secondсоздайте действие контроллера с помощью метода GET и передайте сохраненный байтовый массив из Session
или TempData
в FileResult
:
public ActionResult DownloadCSV()
{
// retrieve byte array here
var array = TempData["Output"] as byte[];
if (array != null)
{
return File(array, System.Net.Mime.MediaTypeNames.Application.Octet, "Products.csv");
}
else
{
return new EmptyResult();
}
}
Наконец, обработайте success
ответ для включения location.href
, который будет перенаправлятьк контроллеру, возвращающему FileResult
для загрузки файла CSV:
$.ajax({
url: '@Url.Action("GetHistoricalUsageApplicationFile", "HUProducts")',
type: 'GET',
data: { "accountCodes": strAccountCodes },
success: function (result) {
if (result == "Success") {
location.href = '@Url.Action("DownloadCSV", "ControllerName")';
}
}
});
Как вариант, вы можете передать имя файла CSV в качестве параметра из ответа AJAX, используя строку запроса.
Связанная проблема:
Создание байтового массива из потока