使用ASP.NETMVC和jQueryAjax请求下载服务器生成的CSV
我正在研究以CSV格式导出数据的机制。 我使用jQuery以使用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
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
,如果您有非常大的文件。此外,进入控制器的模型可以是强类型的,MVCModelBuilder
可以轻松地从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库。非常棒