在asp.net mvc中将视图作为文件提供

时间:2009-08-06 14:28:48

标签: asp.net-mvc

我正在尝试将包含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完成同样的事情,并且很好地返回要下载的文档。

2 个答案:

答案 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,则会将所有内容发送到客户端。然后,为什么您尝试使用更新的标头发送文件,您会收到该错误。