使用CSVHelper将流输出到浏览器

Bob*_*way 29 .net csv asp.net-mvc csvhelper

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

该网站是基于MVC的.这里是我用于调用的jQuery按钮代码(数据是DTO列表的一些序列化Json表示):

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

这是控制器代码:

    [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");
    }
Run Code Online (Sandbox Code Playgroud)

这似乎完全没有实现 - 调用方法步骤到正确的代码位但响应是空的,更不用说为用户提供文件对话框来保存数据.我已经完成了这段代码,它从服务中恢复数据,写入并且不会抛出任何错误.那么我做错了什么?

编辑:回来这个......

return File(ms.GetBuffer(), "text/csv", "export.csv");
Run Code Online (Sandbox Code Playgroud)

...给我一个响应,包括我期待的csv格式的数据.但浏览器似乎仍然不知道如何处理它 - 没有为用户提供下载选项.

Lin*_*Lin 33

试试以下代码:

    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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

更新

下面是如何将复杂类型模型传递给使用GETHTTP方法的操作方法.我不喜欢这种方法,它只是让你知道有一种方法来实现这一点.

模型

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

行动:

    [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" };
    }
Run Code Online (Sandbox Code Playgroud)

视图:

@{
    var data = new Data()
    {
        Id = 1,
        Value = "This is test"
    };
}
@Html.ActionLink("Export", "ExportPayments", new { model = Data.Serialize(data) })
Run Code Online (Sandbox Code Playgroud)