Asp.net mvc 在asp.net mvc中将视图用作文件

Asp.net mvc 在asp.net mvc中将视图用作文件,asp.net-mvc,Asp.net Mvc,我正在尝试将包含html表的视图作为可下载文件以excel文件的形式发送给用户 我不断收到错误“发送HTTP头后服务器无法设置内容类型”。我不知道出了什么问题 下面是一些代码: Excel.aspx: <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <html> <head runat="server"> <title>Excel</title> <

我正在尝试将包含html表的视图作为可下载文件以excel文件的形式发送给用户

我不断收到错误“发送HTTP头后服务器无法设置内容类型”。我不知道出了什么问题

下面是一些代码:

Excel.aspx:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html>
<head runat="server">
    <title>Excel</title>
</head>
<body>
....
</body>
</html>
调试时,字符串“视图”包含:

"\r\n<html>\r\n<body>............................"
“\r\n\r\n”
有什么想法吗?
我对一个blob做了完全相同的事情,它很好地返回了一个要下载的文档。

您是否使用了本文中的RenderViewToString方法:


如果您这样做了,那么就会有一个响应。刷新发送头的代码。默认情况下会启用缓冲,但如果调用Response.Flush,则所有内容都会发送到客户端。然后,为什么您尝试发送带有更新标题的文件,您会收到该错误。

您是否使用了本文中的RenderViewToString方法:


如果您这样做了,那么就会有一个响应。刷新发送头的代码。默认情况下会启用缓冲,但如果调用Response.Flush,则所有内容都会发送到客户端。然后,为什么要尝试发送带有更新标题的文件,就会出现错误。

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

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

我知道这是显而易见的,但您的标题已经发送到客户端,因此您需要找出原因。触发消息头已发送的原因。可能您没有启用缓冲?你是故意在别的地方禁用缓冲吗?你的“视图”数据是一个YSOD(死亡的黄屏),我从那里开始嗯,我没有碰缓冲,但仍然。我做的和在另一个控制器中完全一样,在那里我还返回文档,它在那里工作得很好。。。只是一个返回FileStreamResult的FileResult..你是什么意思,MX导弹?我的“视图”变量包含带有表格和多行的html。。看起来不错。我知道这很明显,但是你的标题已经发送到客户端,所以你需要找出原因。触发消息头已发送的原因。可能您没有启用缓冲?你是故意在别的地方禁用缓冲吗?你的“视图”数据是一个YSOD(死亡的黄屏),我从那里开始嗯,我没有碰缓冲,但仍然。我做的和在另一个控制器中完全一样,在那里我还返回文档,它在那里工作得很好。。。只是一个返回FileStreamResult的FileResult..你是什么意思,MX导弹?我的“视图”变量包含带有表格和多行的html。。看起来很好。是的,就是我用的那个!这似乎就是问题所在。现在,你怎么解决它呢?:-)我想继续用那种方法。不确定。。。为了获取视图的字符串内容,需要在RenderViewToString中调用Flush,这显然是不正确的。我想知道是否有其他方法可以直接将视图写入流?不知道。。我想这是对我使用不懂的代码的惩罚。6个月前,我花了很多时间试图删除响应。Flush()(我用它创建电子邮件模板,然后尝试重定向),但没有成功。我希望有人能解决这个问题。我不记得确切的解决办法,但这篇文章帮助我找到了正确的方向。。标记为答案是的,我就是这么用的!这似乎就是问题所在。现在,你怎么解决它呢?:-)我想继续用那种方法。不确定。。。为了获取视图的字符串内容,需要在RenderViewToString中调用Flush,这显然是不正确的。我想知道是否有其他方法可以直接将视图写入流?不知道。。我想这是对我使用不懂的代码的惩罚。6个月前,我花了很多时间试图删除响应。Flush()(我用它创建电子邮件模板,然后尝试重定向),但没有成功。我希望有人能解决这个问题。我不记得确切的解决办法,但这篇文章帮助我找到了正确的方向。。标记为答案这对你有用吗?这里所做的只是在浏览器中显示HTML对不起,我将删除我的最后一条评论。我的意思是它确实有效!:)但是,您可以尝试将this.Response代码放入视图中。无论哪种方式,它都应该有效。此外,您可能希望确保视图(或者很可能是主视图)不包含表标记(html、head、body)之外的任何内容。不幸的是,这对我不起作用,我需要将20或30个视图呈现为字符串(电子邮件模板)。还有其他想法吗,不管有多老套?为什么行不通?您可以很容易地创建一个母版页,除了“这对您有用吗?”?这里所做的只是在浏览器中显示HTML对不起,我将删除我的最后一条评论。我的意思是它确实有效!:)但是,您可以尝试输入this.Response代码