首页 > 解决方案 > 与剃须刀页面相比,.net core 2.1 mvc 中的 csvhelper 工作方式是否不同?

问题描述

当我在 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 文本文件内容。

任何人都知道为什么剃刀页面与视图和控制器之间的奇怪行为差异?

该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>

标签: c#asp.net-corecsvhelper

解决方案


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");
    }

    // ...
}

推荐阅读