【问题标题】:MVC javascript method call not bringing up excel save dialogMVC javascript方法调用不显示excel保存对话框
【发布时间】:2011-12-05 08:36:59
【问题描述】:

我有一段 javascript,它通过数组和一个 int 发送。

var InvoicesAndId = { values: indexArray, Id:3 };

$.ajax({
type: "POST",
url: 'Invoice/Export',
data: postData,
success: function (data) {location.replace(window.location.pathname); },
dataType: "json",
tradional: true
});

所以这会调用我的控制器上的方法:

public void Export(InvoicesAndId invoicesAndId)
{
...

Response.AppendHeader("content-disposition", "attachment; filename" + "invoices.csv");
Response.ContentType = "application/ms-excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
Response.Write("word");
Response.End();
}

因此,使用调试器,我发现 InvoicesAndId 已正确填充。问题是应该出现一个对话框,说明是打开还是保存 Excel 文件。

这不会发生。

我知道这与我调用函数的方式有关,因为如果我使用 ActionLink 调用它,则会出现对话框。

我做错了什么?跟ajax调用有关系吗?

如何解决这个问题?我不能使用 ActionLink,因为可能没有办法填充参数。

【问题讨论】:

  • 我不明白。你为什么改变接受的答案?您的问题不是关于 MVC ActionResult,而是关于 javascript。达林的回答很好,我也投了赞成票。我的回答是错误的还是没用的?我错过了什么吗?

标签: javascript jquery asp.net-mvc


【解决方案1】:

我做错了什么?

在 ASP.NET MVC 中,您通常调用返回 ActionResult 的控制器操作,它们不使用 Response.Write

public ActionResult Export(InvoicesAndId invoicesAndId)
{
    Response.ContentType = "application/ms-excel";
    byte[] excel = Encoding.UTF8.GetBytes("word"); // Obviously not a valid Excel
    return File(excel, "application/ms-excel", "invoices.csv");
}

现在显然将内容类型设置为"application/ms-excel" 并在响应中写入诸如word 之类的simlpe 字符串,除了损坏的Excel 文件之外别指望得到任何东西。但我想这只是一个示例,您将修复并编写一个真正的 Excel 文件。

如果您打算发送以下内容,请将您的内容类型调整为 CSV:

Response.ContentType = "text/csv";

现在这只是第一部分。第二部分,实际上是问题的根源是您正在使用 AJAX 来调用此控制器操作。您不能使用 AJAX 来调用应该下载文件的控制器操作。仅仅是因为当您使用 AJAX 调用此类操作时,您最终会在成功回调中使用 data javascript 变量传递给它并包含 CSV 文件。显然,由于您现在在客户端,因此您无法对它做任何事情。出于安全原因,您无法将其保存到客户端,也无法提示下载(已下载)。

因此,您应该使用标准链接或表单提交来调用控制器操作,这些操作应该会流式传输要下载的文件。

【讨论】:

    【解决方案2】:

    您不必使用$.ajax,您可以使用$.param() 序列化您的参数并将位置设置为构造的url;

    var InvoicesAndId = { values: indexArray, Id:3 };
    location.href = 'Invoice/Export?' + $.param(InvoicesAndId, true);
    

    这样,浏览器会尝试导航到新的 url,但由于它返回一个文件,会出现文件打开/保存对话框,用户不会导航到另一个 url。

    【讨论】:

      【解决方案3】:
      public class ExcelResult : ActionResult
      {
        public string FileName { get; set; }
        public string Path { get;set; }
      
        public override void ExecuteResult(ControllerContext context)
        {
              context.HttpContext.Response.Buffer = true;
              context.HttpContext.Response.Clear();
              context.HttpContext.Response.AddHeader("content-disposition", "attachment;     filename=" + FileName);
              context.HttpContext.Response.ContentType = "application/vnd.ms-excel";
                context.HttpContext.Response.WriteFile(context.HttpContext.Server.MapPath(Path));   
        }
      }
      

      public ExcelResult GetExcelFile()
      {  
          return new ExcelResult
                    {
                          FileName = "sample.xls", Path = "~/Content/sample.xls"
                    };
                    }`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多