【问题标题】:Does csvhelper work differently in .net core 2.1 mvc as compared to razor pages?与剃须刀页面相比,.net core 2.1 mvc 中的 csvhelper 工作方式是否不同?
【发布时间】:2018-08-27 18:49:42
【问题描述】:

当我在 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-core csvhelper


    【解决方案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");
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2021-04-19
      • 2018-12-19
      • 2018-11-21
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2020-01-09
      • 2013-10-02
      相关资源
      最近更新 更多