我正在尝试将包含html表格的视图作为可下载文件发送给用户,作为excel文件。
我一直收到错误“服务器在发送HTTP标头后无法设置内容类型。”我无法弄清楚出了什么问题......
以下是一些代码:
Excel.aspx:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html>
<head runat="server">
<title>Excel</title>
</head>
<body>
....
</body>
</html>
ControllerAction:
public FileResult Excel()
{
string view = RenderViewToString(this.ControllerContext, "~/Views/Shared/Excel.aspx", null, this.ViewData, this.TempData);
MemoryStream stream = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(view));
string mimetype = RainbowsDotNet.FileHandling.MimeType.GetMimetypeFromExtension(".xls");
FileStreamResult filestreamresult = new FileStreamResult(stream, mimetype);
filestreamresult.FileDownloadName = "Employees_{0}.xls".FormatWith(DateTime.Now.ToString("ddMMyyyy_HHmmss"));
return filestreamresult;
}
调试时,字符串“view”包含:
"\r\n<html>\r\n<body>............................"
有什么想法吗? 我用blob完成同样的事情,并且很好地返回要下载的文档。
答案 0 :(得分:4)
您可以通过将其置于控制器中来解决此问题。它允许您将HTML放在视图中,然后将其发送到浏览器。
public ActionResult Excel()
{
this.Response.AddHeader("Content-Disposition", "Employees_{0}.xls".FormatWith(DateTime.Now.ToString("ddMMyyyy_HHmmss")));
this.Response.ContentType = "application/vnd.ms-excel";
//Do model stuff
Model model = new Model();
return View(model);
}
听起来很丑陋吗?这是一点点。我提到了同样的问题,杰夫指出的问题也是我的问题之一。 :)
正如我的评论所述,您应该确保您的观点没有以下内容:
<html>
<head>
...
</head>
<body>
</body>
</html>
这些都不是必需的,并且可能导致您的页面呈现为HTML,而不是返回的Excel文档。所以你所呈现的只是实际的表格标签和里面的一切。
答案 1 :(得分:1)
您是否使用此帖子中的RenderViewToString方法:Render a view as a string?
如果您这样做,那么该代码中的Response.Flush正在发送标头。默认情况下启用缓冲,但如果您调用Response.Flush,则会将所有内容发送到客户端。然后,为什么您尝试使用更新的标头发送文件,您会收到该错误。