Meskipun hasil tindakan standar FileContentResult atau FileStreamResult dapat digunakan untuk mengunduh file, agar dapat digunakan kembali, membuat hasil tindakan kustom mungkin merupakan solusi terbaik.
Sebagai contoh, mari buat hasil tindakan kustom untuk mengekspor data ke file Excel dengan cepat untuk diunduh.
Kelas ExcelResult mewarisi kelas ActionResult abstrak dan menggantikan metode ExecuteResult.
Kami menggunakan paket FastMember untuk membuat DataTable dari objek IEnumerable dan paket ClosedXML untuk membuat file Excel dari DataTable.
public class ExcelResult<T> : ActionResult
{
private DataTable dataTable;
private string fileName;
public ExcelResult(IEnumerable<T> data, string filename, string[] columns)
{
this.dataTable = new DataTable();
using (var reader = ObjectReader.Create(data, columns))
{
dataTable.Load(reader);
}
this.fileName = filename;
}
public override void ExecuteResult(ControllerContext context)
{
if (context != null)
{
var response = context.HttpContext.Response;
response.Clear();
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.AddHeader("content-disposition", string.Format(@"attachment;filename=""{0}""", fileName));
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dataTable, "Sheet1");
using (MemoryStream stream = new MemoryStream())
{
wb.SaveAs(stream);
response.BinaryWrite(stream.ToArray());
}
}
}
}
}
Di Kontroler gunakan hasil tindakan ExcelResult kustom sebagai berikut
[HttpGet]
public async Task<ExcelResult<MyViewModel>> ExportToExcel()
{
var model = new Models.MyDataModel();
var items = await model.GetItems();
string[] columns = new string[] { "Column1", "Column2", "Column3" };
string filename = "mydata.xlsx";
return new ExcelResult<MyViewModel>(items, filename, columns);
}
Karena kita mendownload file menggunakan HttpGet, buat View kosong tanpa model dan layout kosong.
Posting blog tentang hasil tindakan kustom untuk mendownload file yang dibuat dengan cepat:
https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html