Обслуживание представления в виде файла в asp.net mvc - PullRequest
1 голос
/ 06 августа 2009

Я пытаюсь отправить представление, содержащее 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>............................"

Есть идеи? Я делаю примерно то же самое с блобом, и он приятно возвращает документ для загрузки.

Ответы [ 2 ]

4 голосов
/ 06 августа 2009

Вы можете обойти эту проблему, поместив ее в контроллер. Позволяет поместить 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 голос
/ 06 августа 2009

Использовали ли вы метод RenderViewToString из этого поста: Визуализация представления в виде строки ?

Если вы это сделали, то в этом коде есть Response.Flush, который отправляет заголовки. Буферизация включена по умолчанию, но если вы вызываете Response.Flush, то все отправляется клиенту. И затем, почему вы пытаетесь отправить файл с обновленными заголовками, вы получаете эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...