使用 CSVHelper 将流输出到浏览器

2024-03-03

我正在尝试使用 CSVHelper 生成 CSV 文件并将其发送回浏览器,以便用户可以选择保存位置和文件名并保存数据。

该网站是基于 MVC 的。这是我用来进行调用的 jQuery 按钮代码(数据是 DTO 列表的某种序列化 Json 表示形式):

    $.ajax({
        type: "POST",
        url: unity.baseUrl + "common/ExportPayments",
        data: data
    });

这是控制器代码:

    [HttpPost]
    public FileStreamResult ExportPayments()
    {
        MemoryStream ms = new MemoryStream();
        StreamWriter sw = new StreamWriter(ms);
        CsvWriter writer = new CsvWriter(sw);

        List<Payment_dto> pd = _commonService.GetPayments();

        foreach (var record in pd)
        {
            writer.WriteRecord(record);
        }
        sw.Flush();

        return new FileStreamResult(ms, "text/csv");
    }

这似乎没有实现任何目标 - 调用该方法进入正确的代码位,但响应为空,更不用说为用户提供一个文件对话框来保存数据了。我已经单步执行了这段代码,它从服务带回数据,写入数据,并且没有抛出任何错误。那么我做错了什么?

编辑:返回这个...

return File(ms.GetBuffer(), "text/csv", "export.csv");

...给我一个响应,其中包含我期望的 csv 格式的数据。但浏览器似乎仍然不知道如何处理它——没有向用户提供下载选项。


尝试下面的代码:

    public FileStreamResult  ExportPayments()
    {
        var result = WriteCsvToMemory(_commonService.GetPayments()()); 
        var memoryStream = new MemoryStream(result);
        return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
    }


    public byte[] WriteCsvToMemory(IEnumerable<Payment_dto> records)
    {
        using (var memoryStream = new MemoryStream())
        using (var streamWriter = new StreamWriter(memoryStream))
        using (var csvWriter = new CsvWriter(streamWriter))
        {
            csvWriter.WriteRecords(records);
            streamWriter.Flush();
            return memoryStream.ToArray();
        }
    }

Update

下面是如何将复杂类型模型传递给正在使用的操作方法GETHTTP 方法。我不喜欢这种方法,它只是让您知道有一种方法可以实现这一目标。

Model

    public class Data
    {
        public int Id { get; set; }
        public string Value { get; set; }

        public static string Serialize(Data data)
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Serialize(data);
        }
        public static Data Deserialize(string data)
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Deserialize<Data>(data);
        }
    }

Action:

    [HttpGet]
    public FileStreamResult ExportPayments(string model) 
    {
        //Deserialize model here 
        var result = WriteCsvToMemory(GetPayments()); 
        var memoryStream = new MemoryStream(result);
        return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
    }

View:

@{
    var data = new Data()
    {
        Id = 1,
        Value = "This is test"
    };
}
@Html.ActionLink("Export", "ExportPayments", new { model = Data.Serialize(data) })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CSVHelper 将流输出到浏览器 的相关文章

随机推荐

  • SQLite UTF-8 编码

    我尝试运行脚本 read FILE 具有 UTF 8 字符串 我使用了 pragma 命令 PRAGMA encoding UTF 8 但我得到了错误的字符 如果我自己创建表并插入值 则一切正常 我应该怎么做才能正确运行脚本 顺便说一下 我
  • JMSi18nRoutingBundle 语言选择器

    我已经实现了以下语言切换器 ul if path app request attributes get route li a href ES a li li a href EN a li li a href IT a li else ul
  • 返回 32(或 64)位的 python 哈希函数

    我正在寻找一个返回 32 或 64 位的哈希函数 我尝试了 hashlib 中的 md5 例如 import hashlib hashlib md5 b H hexdigest gives c1d9f50f86825a1a2302ec244
  • jQuery的append()与appendChild()

    这是一些示例代码 function addTextNode var newtext document createTextNode Some text added dynamically var para document getEleme
  • 集成appodeal时出现重复输入错误

    error 错误 任务 app transformClassesWithJarMergingForDebug 执行失败 com android build api transform TransformException java util
  • 从 Class[A] 获取 TypeTag[A]

    I have createOld我需要重写并且无法更改它的方法 我想用TypeTag模式匹配提供的类型createNew 目标是找出如何调用createNew from createOld 我目前的理解是编译器没有足够的类型信息A in c
  • MFC winMain 如何最终进入可执行文件?

    In MFC wWinMain定义于appmodul cpp 据我所知 该文件内置于 mfc90ud dll 中 但是 当我运行我的应用程序时 调用堆栈显示MyApplication exe wWinMain 它是如何采取的wWinMain
  • 通过 Nestjs 从 url 下载图像

    我想从电报帐户下载用户个人资料图片 并使用 Nestjs 框架将其存储在本地存储中 Controller export class Controller constructor private readonly httpService Ht
  • turfjs可以提供地理坐标和应用程序坐标之间的坐标转换吗

    我需要从地理坐标系统到另一个坐标系统的转换 我认为最明显的方法是给出系统的两个边界框 因此 如果我有一个经 纬度坐标的地理 bbox 以及一个与之对应但在我自己的坐标中的非地理 bbox 我想要一个可以将地理到我和我到地理转换的 xfm 我
  • 让 JTextPane 根据内容调整高度

    我想得到一个JTextPane根据我喂它的内容来调整它的高度 我所能做的就是使用 Dimension 设置固定的像素高度 我该如何制作JTextPane折叠 展开以便它适合内容 我可能会补充一点 我在一个GridBagLayout ed J
  • 张量流中 LSTM 的正则化

    Tensorflow 提供了一个很好的 LSTM 包装器 rnn cell BasicLSTM num units forget bias 1 0 input size None state is tuple False activatio
  • 使用 Swashbuckle Aspnetcore 将 `host`、`basePath` 和 `schemes` 添加到 swagger.json

    我正在使用官方文档分步方法来配置 Swagger UI 并在我的 ASP NET core API 应用程序中生成 Swagger JSON 文件 如果我查看生成的 swagger json 文件 它缺少三个重要属性host basePat
  • jQuery attr() 更改 img src

    我正在用 jQuery 制作一些火箭发射效果 当我点击火箭时 它会与另一个火箭图像交换 然后发射 当我单击 重置 链接时 Rocket 必须重置起始位置 并且图像必须恢复原状 但有两个问题 首先 我的火箭图像不会恢复 其次 在它恢复到初始位
  • 升级默认的 python 版本或在 Linux 中安装另一个 python 版本

    我想升级 python 的默认版本 即 usr bin python在Linux中 我安装了多个 python 版本 usr bin python2 7 usr bin python3 3 然而 python命令仍然返回python2 7
  • 在 WindowsFormsHost 之上呈现 WPF 控件

    我知道默认的 WPF 行为是渲染 WPF 控件 然后在顶部渲染 WinForms 但是有什么方法可以在顶部渲染 WPFWindowsFormsHost Edit 我也找到了一个临时黑客 当wpf控件重叠时WindowsFormsHost 我
  • 如何制作一个定时器?

    我想做一个Timer等待 400 MSc 然后打印 hi 例如 我知道如何通过javax swing Timer ActionListener action new ActionListener Override public void a
  • 如何在 Scala 中调用 Function1[_, String]?

    我回答了一个关于函数映射的问题在 Scala 中定义从字符串到函数的映射 https stackoverflow com questions 4617660 defining a map from string to function in
  • 使用 XSLT 删除重复元素

    我需要使用特定节点 ItemID 消除 XML 中的重复元素 我的 XML 如下所示
  • 升级到 gradle 2.1.0 导致 – Could not Expand ZIP 错误

    我最近将 Android 项目的 gradle 插件更新为2 1 0 from 2 1 0 alpha4 但现在我看到我的所有构建都失败了 并显示如下消息 Error Execution failed for task App compil
  • 使用 CSVHelper 将流输出到浏览器

    我正在尝试使用 CSVHelper 生成 CSV 文件并将其发送回浏览器 以便用户可以选择保存位置和文件名并保存数据 该网站是基于 MVC 的 这是我用来进行调用的 jQuery 按钮代码 数据是 DTO 列表的某种序列化 Json 表示形