Javascript 在.NET MVC JQuery中,Ajax将LAOD数据调用为.csv

Javascript 在.NET MVC JQuery中,Ajax将LAOD数据调用为.csv,javascript,jquery,ajax,asp.net-mvc,csv,Javascript,Jquery,Ajax,Asp.net Mvc,Csv,我对控制器进行了ajax调用,以获得以下格式的逗号分隔数据 public ActionResult GetSearchDataforDownloadtoCSV(string pSearchbykeyword, string pRequestCode) { ReportsBE _lReportsBE = new ReportsBE(); _lReportsBE.SearchKeyword = pSearchbykeyword; _lReportsBE.RequestCode =

我对控制器进行了ajax调用,以获得以下格式的逗号分隔数据

public ActionResult GetSearchDataforDownloadtoCSV(string pSearchbykeyword, string pRequestCode)
{
   ReportsBE _lReportsBE = new ReportsBE();
   _lReportsBE.SearchKeyword = pSearchbykeyword;
   _lReportsBE.RequestCode = pRequestCode;

     List<ReportsBE> lstResult = new List<ReportsBE>();
     lstResult = _objReports.GetPackagelistAll_Search(_lReportsBE);

    StringBuilder sb = new StringBuilder();
    sb.Append("Request");
    sb.Append(",");
    sb.Append("Description");
    sb.Append("\n");

    foreach (var _RepBE in lstResult)
    {

        if (_RepBE.RequestCode != null)
        sb.Append(Escape(_RepBE.RequestCode));
        sb.Append(",");
        if (_RepBE.Description != null)
        sb.Append(Escape(_RepBE.Description));

        sb.Append("\n");
    }

return Json(sb.ToString());
}
var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
我的问题是下载控制器返回的逗号分隔字符串作为.csv文件。 请帮忙

var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
我试着像下面这样浏览文件

var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

由于查询字符串的限制,此代码在chrome中工作,但在IE中不工作。任何帮助都将不胜感激。谢谢。

不要使用AJAX,而是使用标准HTML

var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
@使用(Html.BeginForm(“GetSearchDataforDownloadtoCSV”、“Reports”))
{
@LabelFor(model=>model.RequestCode,“请求代码”)
@Html.TextBoxFor(model=>model.RequestCode,新的{style=“width:500px;”})
@LabelFor(model=>model.SearchKeyword,“按关键字搜索包”)
@Html.TextBoxFor(model=>model.SearchKeyword,新的{style=“width:500px;”})
导出到CSV
}

无法使用AJAX请求下载文件的原因是无法用javascript显示“另存为”对话框。因此,在AJAX成功回调中,您无法提示用户保存文件。这就是为什么最简单的解决方案是使用标准表单或锚点直接指向将服务于CSV文件的控制器操作。

就我个人而言,我会使用
FileResult
操作类型,而不是通用的
ActionResult
方法:

var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
    public FileResult Download(long id)
    {
        var fileData = GetSearchDataforDownloadtoCSV(...);
        // use application/octet-stream for file downloads, saves us needing to
        // infer MIME type
        return File(fileData, "application/octet-stream", "Filename.csv");
    }

这样,您根本不需要使用AJAX。

根据Darin Dimitrov&Richard A.的评论,我就是这样解决的

var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
public FileResult GetSearchDataforDownloadtoCSV(string pSearchbykeyword, string pRequestCode)
{
   ReportsBE _lReportsBE = new ReportsBE();
   _lReportsBE.SearchKeyword = pSearchbykeyword;
   _lReportsBE.RequestCode = pRequestCode;

     List<ReportsBE> lstResult = new List<ReportsBE>();
     lstResult = _objReports.GetPackagelistAll_Search(_lReportsBE);

    StringBuilder sb = new StringBuilder();
    sb.Append("Request");
    sb.Append(",");
    sb.Append("Description");
    sb.Append("\n");

    foreach (var _RepBE in lstResult)
    {

        if (_RepBE.RequestCode != null)
        sb.Append(Escape(_RepBE.RequestCode));
        sb.Append(",");
        if (_RepBE.Description != null)
        sb.Append(Escape(_RepBE.Description));

        sb.Append("\n");
    }

byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
return File(buffer, "text/csv", "SearchList.csv");
}

这很有魅力……:)

谢谢您的回复。但在我的表格中有两个按钮。一个按钮叫做“搜索”,它应该在网格中显示结果。另一个按钮用于将结果导出为csv。在这种情况下,我将如何使用标准HTML表单?请提供帮助。然后单击相应的按钮时,只需使用javascript提交表单。不要尝试任何AJAX调用,它不会工作。如果我的两个按钮都用不同的actionresult连接在控制器中会怎么样。例如,对于btnSubmit,actionresult是“LoadGrid”,对于btnDownload csv,“DownlaodCSVData”是操作结果。这意味着我不能简单地通过js发布表单。我必须发送参数以及从页面。你能指引我吗。。PLSY您可以将表单操作保留为默认的submit按钮,当用户单击相应javascript处理程序中的export to CSV按钮时,您可以在触发submit之前设置表单操作。
var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);