Работает ли 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");
    }

    // ...
}
Другие вопросы по тегам