首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >content-disposition不会导致另存为

content-disposition不会导致另存为
EN

Stack Overflow用户
提问于 2012-01-12 02:29:20
回答 2查看 3.3K关注 0票数 4

我有以下代码:

代码语言:javascript
复制
Response.ClearContent();
Response.AddHeader( "Content-type", "application/vnd.ms-excel");
Response.AddHeader("content-disposition", "attachment;filename=test.xls");
Response.ContentType = "application/excel";
var swr = new StringWriter();
var tw = new HtmlTextWriter(swr);
grd.RenderControl(tw);
Response.Write(swr.ToString());
Response.Flush();
Response.End();
tw.Close();
swr.Close();

此操作由以下一段jquery代码触发:

代码语言:javascript
复制
   <img src="../../../../Content/images/Excel-icon.png" 
      onclick = "alert ($('#Filter').serialize());
                    $.ajax({
                         type: 'POST',
                         url: '<%=Url.Action( "Excel") %>',
                         data: $('#Filter').serialize(),
                         success : function (data, textStatus, jqXHR) 
                              { alert (data);},
                         error: function (jqXHR, textStatus, errorThrown)
                              { alert (textStatus + ' ' + errorThrown);}
                         });" />

我已经向fiddler确认了报头具有预期值。我还可以使用Web视图查看fiddler中的数据。

此外,当我显示来自success函数的数据内容时,它包含我试图导出到excel中的表的原始html。

提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

发布于 2012-01-12 02:33:31

哦,不,你不能使用AJAX下载文件。执行AJAX调用,将文件流式传输到客户端,执行成功回调,并将文件的内容传递给您将被卡住的位置。出于明显的安全原因,您无法对此数据做太多操作。您无法将其保存到客户端计算机。在此阶段,不能显示“另存为”提示。

因此,删除javascript AJAX调用,并使用普通GET或POST请求调用控制器操作。

票数 5
EN

Stack Overflow用户

发布于 2012-01-12 02:34:18

我建议不要将代码直接放在Action方法中--这不是使用MVC的一种非常干净的方式,而且肯定不能从AJAX请求中触发文件下载。

您可以从FileResult类派生一个新的操作结果--称为ExcelResult --覆盖它的ExecuteResult方法以强制内容到Response中。

点击按钮应该只是通过一个链接点击操作(导航到它)。来自服务器和浏览器的响应将协同工作,在用户不浏览到新页面的情况下强制文件。

示例:

代码语言:javascript
复制
public class ExcelResult : FileResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        string file;

        using (var swr = new StringWriter())
        {
            using (var tw = new HtmlTextWriter(swr))
            {
                // Not sure where your grd object comes from
                grd.RenderControl(tw);
                file = swr.ToString();
            }
        }

        var response = context.HttpContext.Response;

        response.Buffer = true;
        response.Clear();
        response.ClearHeaders();
        response.ContentType = "application/excel";
        response.CacheControl = "public";
        response.AddHeader("Pragma", "Public");
        response.AddHeader("Expires", "0");
        response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.AddHeader("Content-Description", "describe your file");
        response.AddHeader("Content-Disposition","attachment; filename=excel.xls");
        response.Write(file);
        response.Flush();
        response.End();
    }

}

你的行动很简单:

代码语言:javascript
复制
public ExcelResult Excel()
{
    return new ExcelResult(/* whatever you need to pass */);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8824630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档