Работает ли csvhelper по-другому в.net core 2.1 mvc по сравнению со страницами бритвы?
Кажется, я получаю другое поведение, используя аддон csvhelper, когда использую его в контроллерах mvc по сравнению со страницами бритвы. Следующий код работает в.net core 2.1 mvc:
public void ExportReportsToRecords()
{
Response.ContentType = "text/csv";
Response.ContentType = "application/octet-stream";
StringWriter sw = new StringWriter();
var writer = new CsvWriter(sw);
IEnumerable records = (_context.ReportsToRecords.ToList());
writer.WriteRecords(records);
foreach (ReportsToRecords record in records)
{
writer.WriteRecord(record);
}
Response.WriteAsync(sw.ToString());
}
Он создает CSV-файл в моем браузере Chrome, который затем можно дважды щелкнуть в Excel. Код выше находится в коде моего контроллера.
Когда я использую на странице бритвы в коде ниже:
namespace RTMGMTCore2Razor.Pages.RequiredCorrections
{
public class ExportCorrectionsModel : PageModel
{
private readonly RTMGMTCore2Razor.Models.RTMGMTContext _context;
public ExportCorrectionsModel(RTMGMTContext context)
{
_context = context;
}
public const string MessageKey = nameof(MessageKey);
public void OnGet()
{
try
{
Response.ContentType = "text/csv";
Response.ContentType = "application/octet-stream";
StringWriter sw = new StringWriter();
var writer = new CsvWriter(sw);
IEnumerable records = (_context.RequiredCorrectionsSet.ToList());
writer.WriteRecords(records);
foreach (RequiredCorrectionsSet record in records)
{
writer.WriteRecord(record);
}
Response.WriteAsync(sw.ToString());
TempData[MessageKey] = "Export Succeeded!";
}
catch
{
TempData[MessageKey] = "Export Failed!";
}
return;
}
}
}
он пытается создать документ CSV в нижней части браузера Chrome, но появляется сообщение об ошибке сети. Когда я переключаю его на Microsoft Edge, он фактически показывает содержимое текстового файла CSV прямо в браузере.
Кто-нибудь имеет какое-либо представление о том, почему странные различия в поведении между страницами бритвы в этом отношении по отношению к представлениям и контроллерам?
Cshtml это:
@page
@model RTMGMTCore2Razor.Pages.RequiredCorrections.ExportCorrectionsModel
@{
ViewData["Title"] = "ExportCorrections";
}
<h2>ExportCorrections</h2>
<form method="get" asp-page="ExportCorrections"> </form>
@if (TempData[RTMGMTCore2Razor.Pages.ReportsToRecord.ExportReportsToRecordsModel.MessageKey] is string message)
{
<h4>@message</h4>
}
<a asp-page="./Index">Back to List</a>
1 ответ
Модель Razor Page ориентирована на страницу, что означает, что в большинстве случаев страница Razor используется для отображения страницы. Если вы хотите ответить потоком, просто используйте File()
вернуть FileContentResult
,
Чтобы исправить ошибку, измените метод в вашей PageModel, как показано ниже:
// file : ExportCorrectionsMode.cshtml.cs
// ...
public class ExportCorrectionsModel : PageModel
{
// ...
public ActionResult OnGet()
{
var sw = new StringWriter();
var writer = new CsvWriter(sw);
IEnumerable records = (_context.RequiredCorrectionsSet.ToList());
writer.WriteRecords(records);
var bytes = Encoding.UTF8.GetBytes(sw.ToString());
return File(bytes, "application/octet-stream", "text/csv");
}
// ...
}