C# 保存文件

C# 保存文件,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个导出到csv选项,但在弹出文件对话框时遇到了问题(我使用了教程)。单击csv按钮时,表单将在导出选项设置为true时触发,因此控制器如下所示: [HttpPost] public ActionResult FieldQueryResult(QueryInput input, bool exportCsv) { //input gets processed to create 'sb' which is the csv string if (exportCsv)

我有一个导出到csv选项,但在弹出文件对话框时遇到了问题(我使用了教程)。单击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");               
        }
}

然而,它只是一步一步地完成这段代码,而没有弹出文件对话框。请问我做错了什么?我想可能是因为我从
ActionResult
返回了一个
FileContentResult
,但据我所知,它们应该是可互换的。

phew,这是一个经历了多次尝试都没有成功的解决方案的过程,但我最终通过一些ajax和一个会话变量得到了它,所以我想我应该把它贴在这里,以防对其他人有所帮助

问题的关键是,要使FileResult正常工作,需要从Actionlink调用它,但我是从表单中创建csv字符串的,似乎在发布表单后无法显示文件对话框。我所做的是将表单放在ajax post中,然后在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:)

好的,文件“保存”对话框取决于客户端的浏览器设置-您真正想要什么
FileContentResult
显然继承自
ActionResult
,因此,出于文件返回目的,它是合法的。请尝试将“text/csv”更改为System.Net.Mime.MediaTypeNames.Application.OctetS。Petrosv,我试过了,但没什么不同。Tetsuya,我只想弹出文件另存为对话框,这样用户就可以保存csv文件。我记得这只适用于受支持的文件格式,如pdf,如果浏览器支持,它会将pdf作为“站点”打开。您可以尝试直接写入流。