표준 작업 결과 FileContentResult 또는 FileStreamResult를 파일 다운로드에 사용할 수 있지만 재사용 성을 위해 사용자 지정 작업 결과를 만드는 것이 가장 좋은 솔루션 일 수 있습니다.
예를 들어 다운로드를 위해 즉시 Excel 파일로 데이터를 내보내는 사용자 지정 작업 결과를 만들어 보겠습니다.
ExcelResult 클래스는 추상 ActionResult 클래스를 상속하고 ExecuteResult 메서드를 재정의합니다.
IEnumerable 개체에서 DataTable을 생성하기 위해 FastMember 패키지를 사용하고 DataTable에서 Excel 파일을 생성하기 위해 ClosedXML 패키지를 사용하고 있습니다.
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());
}
}
}
}
}
컨트롤러에서 다음과 같이 사용자 지정 ExcelResult 작업 결과를 사용합니다.
[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);
}
HttpGet을 사용하여 파일을 다운로드하고 있으므로 모델없이 빈 레이아웃과 빈 뷰를 만듭니다.
즉석에서 생성 된 파일을 다운로드하기위한 사용자 지정 작업 결과에 대한 블로그 게시물 :
https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html