我对控制器进行了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());
}
这是我的HTML,
@Html.LabelFor(model => model.SearchKeyword, "Search Packages by Keyword")
@Html.TextBoxFor(model => model.SearchKeyword, new { style = "width: 500px;" })
<button type="button" id="btnExport" onclick="DownloadCSV()" value="Export to CSV">Export to CSV</button>
这是我的ajax电话,
function DownloadCSV() {
var _pSearchbykeyword = $('#SearchKeyword').val();
var _pRequestCode = $('#RequestCode').val();
var postData = {
pSearchbykeyword: _pSearchbykeyword == '' ? '' : _pSearchbykeyword
, pRequestCode: _pRequestCode == '' ? '' : _pRequestCode
};
$.ajax({
type: 'POST',
url: '@Url.Action("GetSearchDataforDownloadtoCSV", "Reports")',
data: postData,
success: function (data) {
if (data != null) {
// need to code here to through comma seperated data as csv file...
}
},
error: function (xhr, ErrorText, thrownError) {
alert("No Records Found!");
}
});
}
我的问题是将从控制器返回的逗号分隔字符串下载为.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);
由于查询字符串限制,此代码在chrome中工作,但在IE中不起作用。任何帮助将非常感激。感谢。
答案 0 :(得分:2)
不要使用AJAX,而是使用标准HTML <form>
:
@using (Html.BeginForm("GetSearchDataforDownloadtoCSV", "Reports"))
{
@Html.LabelFor(model => model.RequestCode, "Request Code")
@Html.TextBoxFor(model => model.RequestCode, new { style = "width: 500px;" })
@Html.LabelFor(model => model.SearchKeyword, "Search Packages by Keyword")
@Html.TextBoxFor(model => model.SearchKeyword, new { style = "width: 500px;" })
<button type="submit" value="Export to CSV">Export to CSV</button>
}
您无法使用AJAX请求下载文件的原因是您无法在javascript中显示“另存为”对话框。因此,在您的AJAX成功回调中无法做任何事情来提示用户保存文件。这就是为什么最简单的解决方案是使用标准表单或锚点直接指向将为CSV文件提供服务的控制器操作。
答案 1 :(得分:0)
就个人而言,我会使用FileResult
操作类型而不是通用ActionResult
方法:
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。
答案 2 :(得分:0)
这就是我按照Darin Dimitrov&amp; amp;理查德A.评论,
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");
}
在我的Javascript中,
function DownloadCSV() {
var _pSearchbykeyword = $('#SearchKeyword').val();
var _pRequestCode = $('#RequestCode').val();
pSearchbykeyword= _pSearchbykeyword == '' ? '' : _pSearchbykeyword;
pRequestCode = _pRequestCode == '' ? '' : _pRequestCode;
window.location = "Reports/GetSearchDataforDownloadtoCSV?pSearchbykeyword=" + pSearchbykeyword + "&pRequestCode=" + pRequestCode;
}
这就像魅力......:)