MVC保存文件

时间:2017-05-19 09:06:29

标签: c# asp.net-mvc

我有一个导出到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,但是从我读过的内容中他们应该可以互换。

1 个答案:

答案 0 :(得分:1)

p p,嗯,通过许多尝试找到一个不起作用的解决方案,但是我终于得到了它,通过一些ajax和一个会话变量,所以我想我会在这里发布它以防万一其他人。

问题的症结在于,要使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。 :)