39

CSVHelper を使用して CSV ファイルを生成し、それをブラウザーに送り返そうとしているので、ユーザーは保存場所とファイル名を選択してデータを保存できます。

Web サイトは 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形式のデータで構成される応答が返されます。しかし、ブラウザーはまだそれをどう処理すればよいかを認識していないようです。ユーザーにダウンロード オプションが提供されていません。

4

3 に答える 3

50

以下のコードを試してください:

    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();
        }
    }

アップデート

GET以下は、 HTTP メソッドを使用しているアクション メソッドに複合型モデルを渡す方法です。私はこのアプローチを好みません。これを達成するためのアプローチがあるという考えを与えるだけです。

モデル

    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);
        }
    }

アクション:

    [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" };
    }

意見:

@{
    var data = new Data()
    {
        Id = 1,
        Value = "This is test"
    };
}
@Html.ActionLink("Export", "ExportPayments", new { model = Data.Serialize(data) })
于 2014-01-13T15:30:15.033 に答える
0

コントローラーで試してください:

HttpContext.Response.AddHeader("content-disposition", "attachment; filename=payments.csv");
于 2014-01-13T14:40:36.353 に答える