2011-12-29 62 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,因爲流被丟棄。如果我移動使用的返回外部,結果爲空。我在這裏做錯了什麼?任何想法,我如何才能正常工作?

回答

0

要在using塊使用一個類,這個類必須實現IDisposable。當程序塊結束時,它會調用IDisposable.Dispose()來處理你的Stream。這是一個很好的做法,但是如果你想要這個流,可以刪除using或者把它放回去。我會選擇第二個選項。

+1

在上面的代碼中,返回是在這種情況下不起作用的使用。 – Hcabnettek 2011-12-29 19:41:41

+0

對不起,你是對的。上面的代碼應該返回一個有效的'MemoryStream'對象。你可以發佈你正在調用流的位置,即這個方法的調用語句嗎? – 2011-12-29 19:47:05

+0

var stream = Utils.RenderViewToStream(this,「print」,ViewData); – Hcabnettek 2011-12-29 19:48:42

2

StreamWriter上的using語句也會關閉基礎流。 刪除StreamWriter上的using聲明以使流保持活動狀態。
另一種選擇是返回一個字節數組而不是內存流。

return ms.ToArray(); 
+0

流;爲什麼關閉streamwriter或htmltextwriter會影響內存流的狀態? – 2011-12-29 19:36:56

+1

@DavidLively那麼,'StreamWriter'就是這樣工作的。爲什麼這是你必須問MS。 – Magnus 2011-12-29 19:44:49

+0

+1 a)糾正流寫入器。 b)由於沒有真正流式傳輸,因此返回流實在沒有意義。使用'GetBuffer()'雖然 – jgauffin 2011-12-29 19:53:49

-1

你有2個usings他是說把回用()的outter內

像`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 2011-12-29 19:49:31