【发布时间】:2019-03-18 16:28:43
【问题描述】:
我有一个控制器操作方法,它返回一个文件以供下载。 我需要通过 Jquery 调用这个动作方法,那么,我如何获取文件以供下载?
我知道怎么通过ajax调用或者window.location来调用action方法,但是由于action方法结果是一个文件,我怎么把它放到JQuery里面供用户下载呢?
这是我的操作方法:
public async Task<IActionResult> ExportClientes()
{
var model = new BasesDadosViewModel();
model.Clientes = await _db.Clientes.ToListAsync();
model.ClienteObj = new Clientes();
DataTable dt = new DataTable();
List<string> DontUse_Field = typeof(Clientes).GetProperties().Where(x => x.GetCustomAttributes(typeof(ObjAttributes), true).Any(ca => ((ObjAttributes)ca).DontUse)).Select(x => x.Name).ToList();
var cliente_fields = model.ClienteObj.GetType().GetProperties();
//formatar colunas da datatable
foreach (var field in cliente_fields)
{
DataColumn col = dt.Columns.Add(field.Name, field.PropertyType);
}
foreach (var cliente in model.Clientes)
{
DataRow export_row = dt.NewRow();
//Preenche dados
int c = 0;
foreach (var field in cliente_fields)
{
if (!DontUse_Field.Contains(field.Name))
{
export_row[c] = field.GetValue(cliente);
c++;
}
}
dt.Rows.Add(export_row);
}
ExcelPackage excel = new ExcelPackage();
var workSheet = excel.Workbook.Worksheets.Add("Clientes_Export");
for (int i = 1; i < dt.Columns.Count; i++)
{
workSheet.Cells[1, i].Value = dt.Columns[i - 1];
}
int index = 2;
foreach (DataRow row in dt.Rows)
{
for (int i = 1; i < dt.Columns.Count; i++)
{
workSheet.Cells[index, i].Value = row[i - 1];
}
index++;
}
//Autofit columns
for (int i = 1; i < dt.Columns.Count; i++)
{
workSheet.Column(i).AutoFit();
}
var filename = "Clientes_Export.xlsx";
//var path = Path.Combine(_appEnvironment.WebRootPath, @"exports", filename);
using (var fileStream = new FileStream(filename, FileMode.Create))
{
excel.SaveAs(fileStream);
}
var memory = new MemoryStream();
using (var stream = new FileStream(filename, FileMode.Open))
{
stream.CopyTo(memory);
}
memory.Position = 0;
ContentTypes contentType = new ContentTypes();
return File(memory, contentType.GetContentType(filename), filename);
}
谢谢
【问题讨论】:
标签: jquery .net asp.net-core-2.0