Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASP.NETMVC和jQueryAjax请求下载服务器生成的CSV_Jquery_Ajax_Json_Asp.net Mvc_Csv - Fatal编程技术网

使用ASP.NETMVC和jQueryAjax请求下载服务器生成的CSV

使用ASP.NETMVC和jQueryAjax请求下载服务器生成的CSV,jquery,ajax,json,asp.net-mvc,csv,Jquery,Ajax,Json,Asp.net Mvc,Csv,我正在研究以CSV格式导出数据的机制。 我使用jQuery以JSON格式发送数据: var data = JSON.stringify(dataToSend); $.post('DumpToCSV', { 'data': data }); 然后在控制器中生成一个CSV文件: public ActionResult DumpToCSV(string data) { Response.Clear(); XmlNode xml = JsonConver

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

var data = JSON.stringify(dataToSend);
 $.post('DumpToCSV', { 'data': data });
然后在控制器中生成一个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;
    }
它返回CSV作为响应,但是我如何告诉浏览器加载它呢

这两个主题之间的区别是: 我使用的是AJAX请求


如果您想下载基于一些可以发布到控制器的数据的文件,最好不要使用Ajax,因为通过Ajax处理文件非常困难。其中一个可行的解决方案是

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

javaScript
代码中:

var urlParams = $.param(dataToSend);
window.location.href = "DumpToCSV"+ urlParams;
通过这种方式,您可以将所有数据序列化为url字符串,并且通过Ajax获取文件不会有任何问题

然后在您的
控制器中
最好返回
FileContentResult
甚至
FileStreamResult
,如果您有非常大的文件。此外,进入控制器的模型可以是强类型的,MVC
ModelBuilder
可以轻松地从url字符串映射它。因此,yout数据对象可以是c类,如下所示:

public class CSVData
{
   public string Name { get; set; }
   public int Count { get; set; }
   public int SomeId { get; set; }
}
    return File(csv, "text/csv", "Custom Report.csv");
而且您根本不需要在控制器中对数据进行理想化。查看更多信息

正如您所看到的,在MVC中不需要使用
HttpContext
,在您的情况下,您可以用更干净、更明显的方式来完成

注:如果您的
csv
对象只是一个
字节[]
,那么您可以这样写:

public class CSVData
{
   public string Name { get; set; }
   public int Count { get; set; }
   public int SomeId { get; set; }
}
    return File(csv, "text/csv", "Custom Report.csv");

可能是重复的,谢谢。我使用了您提到的AJAX库。非常棒