2011-12-29 7 views
0

私はかなり近く私は信じていますが、私のストリームはnullか廃棄されています。ここにサンプルコードがあります。MVCビューからストリームを返す方法は?

var ms = new MemoryStream(); 
using (var sw = new StreamWriter(ms)) 
{ 
    using (var tw = new HtmlTextWriter(sw)) 
    { 
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null); 
    ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
    viewResult.View.Render(viewContext, tw); 
    ms.Position = 0; 
    return ms; 
    } 
} 

ストリームが配置されているため、呼び出しコードの結果としてobjectDisposedExceptionが発生します。私が使用していない状態で戻り値を移動すると、結果はnullになります。私はここで間違って何をしていますか?どのように私はこれが正しく動作することができます任意のアイデアですか?

答えて

0

usingブロックでクラスを使用するには、そのクラスはIDisposableを実装する必要があります。ブロックが終了すると、ストリームを廃棄するIDisposable.Dispose()が呼び出されます。これは良い方法ですが、ストリームが必要な場合は、usingを削除するか、ストリーム内にリターンを入れてください。私は第二の選択肢と一緒に行くだろう。

+1

上記のコードでは、リターンはこの場合には使えないusingの中にあります。 – Hcabnettek

+0

申し訳ありませんが、あなたは正しいです。上記のコードは、有効な 'MemoryStream'オブジェクトを返すべきです。ストリームを呼び出す場所、つまり呼び出しステートメントをこのメソッドに投稿できますか? –

+0

var stream = Utils.RenderViewToStream(this、 "print"、ViewData); – Hcabnettek

2

StreamWriterのusingステートメントは、基になるストリームも閉じます。 StreamWriterusingステートメントを削除して、ストリームを有効にします。
もう1つのオプションは、メモリストリームではなくバイト配列を返すことです。

return ms.ToArray(); 
+0

ストリームのような

。ストリームライターまたはhtmltextwriterを閉じるとメモリストリームの状態に影響するのはなぜですか? –

+1

@DavidLivelyそれは、 'StreamWriter'がどのように動作するかです。なぜあなたはMSに尋ねなければならないのですか? – Magnus

+0

+1 a)ストリームライターについて修正します。 b)何も実際にストリームされていないので、ストリームを返すことは本当に必要ありません。 'GetBuffer()'を使うと少し効率的ですが – jgauffin

-1

あなたは、彼が使用してoutter()の内部でリターンを入れて言っている2 usingsを持っms`を使用してブロックに接続されていない `この

var ms = new MemoryStream(); 
using (var sw = new StreamWriter(ms)) 
{ 
    using (var tw = new HtmlTextWriter(sw)) 
    { 
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null); 
    ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
    viewResult.View.Render(viewContext, tw); 
    ms.Position = 0; 
    } 
    return ms; 
} 
+0

実際に試しましたか? – Magnus

関連する問題