我有一个导出到csv选项但是无法弹出文件对话框(我使用了this教程)。单击csv按钮时,将导出选项设置为true来触发表单,以便控制器如下所示:
[HttpPost]
public ActionResult FieldQueryResult(QueryInput input, bool exportCsv)
{
//input gets processed to create 'sb' which is the csv string
if (exportCsv)
{
var fileString = sb.ToString();
byte[] bytes = new byte[] { };
bytes = Encoding.ASCII.GetBytes(fileString);
return new FileContentResult(bytes, "text/csv");
}
}
然而,它只是逐步执行此代码而不会弹出文件对话框。我做错了什么?我想也许是因为我从FileContentResult
返回了ActionResult
,但是从我读过的内容中他们应该可以互换。
答案 0 :(得分:1)
问题的症结在于,要使FileResult工作,需要从Actionlink调用它,但是我从表单创建了我的csv字符串,看起来你发布后无法显示文件对话框形式。我所做的是将表单放在ajax帖子中,然后在post方法中将csv字符串添加到会话对象,然后成功调用ExportCsv FileResult操作,我可以使用会话变量。
所以ajax:
$('#masterForm').submit(function (ev) {
$.ajax({
type: 'POST',
url: 'Analytics/FieldQueryResult',
data: $('#masterForm').serialize(),
success: function (data) {
if (data.model.ExportCsv === true) {
window.location.href = 'ExportCsv';
}
控制器:
[HttpPost]
public ActionResult FieldQueryResult(QueryInput input, bool exportCsv)
{
//build my csv string, sb
this.Session["fileString"] = sb.ToString();
...
}
然后在ajax成功时,调用ExportCsv Fileresult方法并从会话对象中检索csv字符串
public FileResult ExportCsv()
{
var fileString = this.Session["fileString"].ToString();
byte[] bytes = new byte[] { };
bytes = Encoding.ASCII.GetBytes(fileString);
return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, "report.csv");
}
弹出文件保存对话框,保存csv。 :)