Obwohl Standardaktionsergebnisse FileContentResult oder FileStreamResult zum Herunterladen von Dateien verwendet werden können, ist das Erstellen eines benutzerdefinierten Aktionsergebnisses aus Gründen der Wiederverwendbarkeit möglicherweise die beste Lösung.
Als Beispiel erstellen wir ein benutzerdefiniertes Aktionsergebnis zum sofortigen Exportieren von Daten in Excel-Dateien zum Herunterladen.
Die ExcelResult-Klasse erbt die abstrakte ActionResult-Klasse und überschreibt die ExecuteResult-Methode.
Wir verwenden das FastMember-Paket zum Erstellen von DataTable aus einem IEnumerable-Objekt und das ClosedXML-Paket zum Erstellen einer Excel-Datei aus der 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());
}
}
}
}
}
Verwenden Sie im Controller das Ergebnis der benutzerdefinierten ExcelResult-Aktion wie folgt
[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);
}
Da wir die Datei mit HttpGet herunterladen, erstellen Sie eine leere Ansicht ohne Modell und leeres Layout.
Blogbeitrag über benutzerdefinierte Aktionsergebnisse zum Herunterladen von Dateien, die im laufenden Betrieb erstellt wurden:
https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html