如何从MVC视图返回流?

时间:2011-12-29 19:33:56

标签: c# stream memorystream streamwriter

我相当接近我相信,但我的流是空的或它被处置。这是示例代码。

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,因为流已被释放。如果我将返回移到using之外,则结果为null。我在这做错了什么?任何想法我怎么能正常工作?

3 个答案:

答案 0 :(得分:2)

StreamWriter上的using语句也将关闭基础流。 删除using上的StreamWriter语句以使流保持活动状态 另一种选择是返回一个字节数组而不是一个内存流。

return ms.ToArray();

答案 1 :(得分:0)

要在using块中使用类,该类必须实现IDisposable。当块结束时,它会调用IDisposable.Dispose()来处理你的Stream。这是一个很好的做法,但如果您想要流,请删除using或将回车放入其中。我会选择第二种选择。

答案 2 :(得分:-1)

你有2个标志他说要把返回放在外面使用()

像这样

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