2009-08-06 9 views
1

私はExcelファイルとして、ダウンロード可能なファイルとしてhtmlテーブルをユーザに表示しようとしています。asp.net mvcでファイルとしてビューを提供する

「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; 
    } 

デバッグ、文字列「ビュー間、私はここにいくつかのコードだ...間違っている何が起こっているのか

を把握することはできません"含まれています:

"\r\n<html>\r\n<body>............................" 

何がいいですか? ブロブを使ってまったく同じことを行い、ダウンロードするドキュメントをうまく返します。

+0

これは明らかですが、ヘッダーはすでにクライアントに送信されているため、理由を調べる必要があります。ヘッダーが既に送信された原因は何ですか。バッファリングが有効になっていない可能性がありますか?意図的にバッファリングを無効にしていますか? –

+0

あなたの「ビュー」データはYSOD(死の黄色いスクリーン)です。私はそこから始めるでしょう – mxmissile

+0

うーん、私はバッファリングに触れていませんでしたが、まだ。私は、ドキュメントを返す別のコントローラとまったく同じことを行い、そこでは正常に動作します... FileStreamResultを返すFileResultだけです。 –

答えて

1

この投稿のRenderViewToStringメソッドを使用しましたか:Render a view as a string

これを実行した場合、ヘッダーを送信しているコードにResponse.Flushがあります。バッファリングはデフォルトで有効になっていますが、Response.Flushを呼び出すとすべてがクライアントに送信されます。そして、更新されたヘッダーでファイルを送信しようとすると、そのエラーが発生します。

+0

これは私が使用しているものです!それは問題のようです。今、あなたはそれをどのように解決しますか? :-) 私はその方法を使い続けたいと思います。 –

+0

わかりません...ビューの文字列の内容を取得するために、RenderViewToStringでFlushを呼び出す必要があることは間違いありません。ストリームに直接ビューを書き込む他の方法があるのだろうか? –

+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); 
} 

サウンドhacky?それは少しです。私はあなたが言及したのと同じ問題を抱えていて、Jeffが指摘している質問も私のものです。のではなく、本の

<html> 
    <head> 
    ... 
    </head> 
    <body> 
    </body> 
</html> 

なしは必要ありませんし、あなたのページをHTMLとしてレンダリングされる可能性があり:私のコメントで述べたように:)

、あなたはあなたのビューには、次のを持っていないことを確認する必要がありますExcelドキュメントが返されます。だからあなたが描写するのは、実際のテーブルタグとその中のすべてです。

+0

としてマーキングはあなたのためにこの作品ですか?ここにあるのはブラウザのHTMLを表示することです –

+0

申し訳ありません、私は最後のコメントを削除します。私はそれが仕事を意味する! :)しかし、あなたはthis.Responseコードをビューの中に入れてみることができます。いずれにせよ、それは動作するはずです。 また、ビュー(またはマスターである可能性が高い)に表タグ(html、head、body)の外側に何も含まれていないようにすることができます。 –

+0

残念ながら、これは私にとってはうまくいかず、ここでは文字列(電子メールテンプレート)に20または30のビューをレンダリングする必要があります。他のアイデア、どのようにハッキーですか? –

関連する問題