FileContentResult veya FileStreamResult standart eylem sonuçları dosyaları indirmek için kullanılabilse de, yeniden kullanılabilirlik için özel bir eylem sonucu oluşturmak en iyi çözüm olabilir.
Örnek olarak, verileri indirmek için anında Excel dosyalarına aktarmak için özel bir eylem sonucu oluşturalım.
ExcelResult sınıfı, soyut ActionResult sınıfını miras alır ve ExecuteResult yöntemini geçersiz kılar.
IEnumerable nesnesinden DataTable oluşturmak için FastMember paketi ve DataTable'dan Excel dosyası oluşturmak için ClosedXML paketi kullanıyoruz.
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());
}
}
}
}
}
Denetleyicide özel ExcelResult eylem sonucunu aşağıdaki gibi kullanın
[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);
}
Dosyayı HttpGet kullanarak indirdiğimiz için, model ve boş layout olmadan boş bir View oluşturun.
Anında oluşturulan dosyaları indirmek için özel eylem sonucu hakkında blog yayını:
https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html