How to Export CSV file from ASP.NET core

匿名 (未验证) 提交于 2019-12-03 01:36:02

问题:

I am trying to migrate code from ASP.net to ASP.net core.

Where as in ASP.net code was like below,

var progresses = db.Progresses.Where(p => p.UserId == id).Include(p => p.User.UserMetaData).Include(p => p.Quiz).Include(p => p.User.Groups).OrderByDescending(p => p.UpdatedAt).ToList();  List<ReportCSVModel> reportCSVModels = new List<ReportCSVModel>(); const string downloadName = "Reports.csv"; var csv = new CsvWriter(Response.Output);  csv.Configuration.RegisterClassMap<ReportCSVMap>();  Response.ClearContent();  Response.ContentType = "application/octet-stream";  Response.AddHeader("Content-Disposition",    "attachment; filename=" + downloadName);  csv.WriteHeader<ReportCSVModel>(); foreach (var progress in progresses) {     var reportCSVModel = new ReportCSVModel();     reportCSVModel.Quiz = progress.Quiz.Title;     reportCSVModel.Score = (progress.CorrectAnswersCount * progress.PointsPerQuestion).ToString();     reportCSVModel.Status = progress.Status;     reportCSVModel.CompletedDate = progress.UpdatedAt.ToString();     reportCSVModel.Location = progress.User.UserMetaData != null ? progress.User.UserMetaData.Location : "";     reportCSVModel.Group = progress.User.Groups.FirstOrDefault() != null ? progress.User.Groups.FirstOrDefault().Name : "";      csv.WriteRecord<ReportCSVModel>(reportCSVModel); } Response.Flush(); Response.End(); return null; 

But while using it in ASP.NET core, I Converted it like,

var progresses = _elearnContext.Progress.Where(p => p.UserId == id).Include(p => p.User.UserMetaData).Include(p => p.Quiz).Include(p => p.User.Groups).OrderByDescending(p => p.UpdatedAt).ToList();  // List<ReportCSVModel> reportCSVModels = new List<ReportCSVModel>(); List<ReportCSVModel> reportCSVModels = new List<ReportCSVModel>(); const string downloadName = "Reports.csv";  System.IO.TextWriter writeFile = new StreamWriter(Response.Body.ToString()); CsvWriter csv = new CsvWriter(writeFile); csv.Configuration.RegisterClassMap<GroupReportCSVMap>(); Response.Clear(); Response.ContentType = "application/octet-stream"; Response.Headers.Add("Content-Disposition", "attachment; filename=" + downloadName);   csv.WriteHeader<ReportCSVModel>(); foreach (var progress in progresses) {     var reportCSVModel = new ReportCSVModel();     reportCSVModel.Quiz = progress.Quiz.Title;     reportCSVModel.Score = (progress.CorrectAnswersCount * progress.PointsPerQuestion).ToString();     reportCSVModel.Status = progress.Status;     reportCSVModel.CompletedDate = progress.UpdatedAt.ToString();     reportCSVModel.Location = progress.User.UserMetaData != null ? progress.User.UserMetaData.Location : "";     reportCSVModel.Group = progress.User.Groups.FirstOrDefault() != null ? progress.User.Groups.FirstOrDefault().Name : "";      csv.WriteRecord<ReportCSVModel>(reportCSVModel); }  Response.Clear(); return null; 

In ASP.net where Response.Output is available but its not available in core. So I tried to use it like Response.Body

Can Anybody tell me, where I did wrong?

回答1:

Consider changing approach to align more with current suggested syntax.

Construct the CSV and return a FileResult, which allow the code to not have to directly manipulate the Response object.

[HttpGet] public IActionResult MyExportAction() {     var progresses = _elearnContext.Progress.Where(p => p.UserId == id)         .Include(p => p.User.UserMetaData)         .Include(p => p.Quiz)         .Include(p => p.User.Groups)         .OrderByDescending(p => p.UpdatedAt)         .ToList()         .Select(progress =>              new ReportCSVModel() {                 Quiz = progress.Quiz.Title,                 Score = (progress.CorrectAnswersCount * progress.PointsPerQuestion).ToString(),                 Status = progress.Status,                 CompletedDate = progress.UpdatedAt.ToString(),                 Location = progress.User.UserMetaData != null ? progress.User.UserMetaData.Location : "",                 Group = progress.User.Groups.FirstOrDefault() != null ? progress.User.Groups.FirstOrDefault().Name : ""             }         );      List<ReportCSVModel> reportCSVModels = progresses.ToList();      var stream = new MemoryStream();     var writeFile = new StreamWriter(stream);     var csv = new CsvWriter(writeFile);     csv.Configuration.RegisterClassMap<GroupReportCSVMap>();      csv.WriteRecords(reportCSVModels);      stream.Position = 0; //reset stream     return File(stream, "application/octet-stream", "Reports.csv"); } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!