c# - 与剃须刀页面相比,.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>
解决方案
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");
}
// ...
}
推荐阅读
- c# - 字典中缺少 TryAdd() 的定义
- python - 人脸识别 - 每天更新参考人脸编码
- html - Ng-select 多选复选框禁用组
- java - AWS SDK Java DynamoDB - 使用表达式属性名称查询 - 未定义表达式中使用的表达式属性值
- npm - 通过 cmake execute_process 获取 npm --version
- xml - XML、XPath 和按属性值在同一级别上分组节点/属性
- java - 如何在 PreviewView 在屏幕上显示它们之前处理图像?我想做物体检测
- python-3.x - 如何解决 EOFError:在 azure devops 管道中读取一行时出现 EOF
- azure-devops - 使用许可的自定义 Azure DevOps 扩展开发
- google-cloud-platform - Recommendations AI 项目中的“INCORRECT_JSON_FORMAT userEvent”错误