使用ASP .NET MVC和jQuery AJAX请求下载服务器生成的CSV

Vit*_*nin 5 csv ajax asp.net-mvc jquery json

我正在研究以CSV格式导出数据的机制.我JSON使用jQuery以格式发送数据:

var data = JSON.stringify(dataToSend);
 $.post('DumpToCSV', { 'data': data });
Run Code Online (Sandbox Code Playgroud)

然后在控制器中我生成一个CSV文件:

 public ActionResult  DumpToCSV(string data)
    {
        Response.Clear();

        XmlNode xml = JsonConvert.DeserializeXmlNode("{records:{record:" + data + "}}");

        XmlDocument xmldoc = new XmlDocument();
        //Create XmlDoc Object
        xmldoc.LoadXml(xml.InnerXml);
        //Create XML Steam 
        var xmlReader = new XmlNodeReader(xmldoc);
        DataSet dataSet = new DataSet();
        //Load Dataset with Xml
        dataSet.ReadXml(xmlReader);
        //return single table inside of dataset
        var csv = CustomReportBusinessModel.ToCSV(dataSet.Tables[0], ",");

        HttpContext context = System.Web.HttpContext.Current;
        context.Response.Write(csv);
        context.Response.ContentType = "text/csv";
        context.Response.AddHeader("Content-Disposition", "attachment;filename=Custom Report.csv");
        Response.End();
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

它返回CSV作为响应,但我如何告诉浏览器下载它?

此主题之间的区别: 将文件返回到ASP.NET MVC中的查看/下载 是我正在使用AJAX请求

teo*_*kot 12

如果你想根据你可以发布到Controller的一些数据下载文件,最好不要使用Ajax,因为通过Ajax处理文件真的很难.一个可行的解决方案是添加到其他库的链接.

我想建议你的是使用简单的GET请求:

在你的javaScript代码中:

var urlParams = $.param(dataToSend);
window.location.href = "DumpToCSV"+ urlParams;
Run Code Online (Sandbox Code Playgroud)

这样,您将所有数据序列化为url字符串,并且通过Ajax获取文件没有问题.

然后在你Controller的最好返回,FileContentResult或者即使FileStreamResult你有很大的文件.此外,进入yout控制器的模型可以强类型化,MVC ModelBuilder可以轻松地从url字符串映射.所以你的数据对象可以像这样c#类:

public class CSVData
{
   public string Name { get; set; }
   public int Count { get; set; }
   public int SomeId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而且您根本不需要在Controller中使用您的数据.在这里查看更多信息.

public FileContentResult DumpToCSV(CSVData data)
{
    XmlNode xml = data.ToXmlNode();

    XmlDocument xmldoc = new XmlDocument();
    //Create XmlDoc Object
    xmldoc.LoadXml(xml.InnerXml);
    //Create XML Steam 
    var xmlReader = new XmlNodeReader(xmldoc);
    DataSet dataSet = new DataSet();
    //Load Dataset with Xml
    dataSet.ReadXml(xmlReader);
    //return single table inside of dataset
    var csv = CustomReportBusinessModel.ToCSV(dataSet.Tables[0], ",");

    return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Custom Report.csv");
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的HttpContext,在您的情况下无需使用MVC,您可以更清洁,更明显地使用它.

PS.如果您的csv对象只是一个,byte[]那么您可以像这样写:

    return File(csv, "text/csv", "Custom Report.csv");
Run Code Online (Sandbox Code Playgroud)