代码之家  ›  专栏  ›  技术社区  ›  Thomas Stock

在ASP.NET MVC中将视图作为文件提供

  •  1
  • Thomas Stock  · 技术社区  · 17 年前

    我试图将包含HTML表的视图作为可下载文件发送给用户,作为Excel文件。

    我一直收到“发送HTTP头后服务器无法设置内容类型”的错误。我不知道怎么了…

    下面是一些代码:

    Excel.aspx:

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
    <html>
    <head runat="server">
        <title>Excel</title>
    </head>
    <body>
    ....
    </body>
    </html>
    

    控制器操作:

       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 回复  |  直到 17 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    您是否使用了本文中的renderview to字符串方法: Render a view as a string ?

    如果您这样做了,那么在发送头的代码中有一个response.flush。默认情况下启用缓冲,但如果调用response.flush,则所有内容都将发送到客户端。然后,为什么要发送带有更新头的文件,就会得到这个错误。

        2
  •  4
  •   Dan Atkinson    17 年前

    你可以把这个放在控制器里来解决这个问题。它允许您将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文档。因此,您将呈现的只是实际的表标记以及其中的所有内容。