与 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");
}
// ...
}
当我在 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");
}
// ...
}