与 razor 页面相比,csvhelper 在 .net core 2.1 mvc 中的工作方式是否不同?

Does csvhelper work differently in .net core 2.1 mvc as compared to razor pages?

当我在 mvc 控制器和 razor 页面中使用 csvhelper 插件时,我似乎得到了不同的行为。以下代码适用于 .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());
}

它在我的 chrome 浏览器中创建了一个 csv 文件,然后可以在 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;
        }
    }
}

它尝试在 chrome 浏览器的底部创建 csv 文档,但出现网络错误消息。当我切换到 Microsoft Edge 时,它​​实际上直接在浏览器中显示 csv 文本文件内容。

有人知道为什么 razor 页面与视图和控制器之间的奇怪行为差异吗?

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>

Razor 页面模型是面向页面的,这意味着在大多数情况下,Razor 页面用于显示页面。如果你想用流响应,只需使用 File() 到 return a 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");
    }

    // ...
}