2011-12-29 3 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; 
    } 
} 

вызывающий код вызывает объектDisposedException, потому что поток удален. Если я перемещаю возврат за пределы использования, результат будет нулевым. Что я здесь делаю неправильно? Любые идеи, как я могу это работать правильно?

ответ

0

Чтобы использовать класс в using блоке, что класс должен реализовывать IDisposable. Когда блок заканчивается, он вызывает IDisposable.Dispose(), который располагает вашим потоком. Это хорошая практика, но если вы хотите поток, либо удалите using, либо положите туда возврат. Я бы пошел со вторым вариантом.

+1

В приведенном выше коде возврат находится внутри использования, которое не работает в этом случае. – Hcabnettek

+0

Прошу прощения, вы правы. Вышеприведенный код должен возвращать действительный объект «MemoryStream». Можете ли вы опубликовать, где вы вызываете поток, т. Е. Оператор вызова для этого метода? –

+0

var stream = Utils.RenderViewToStream (это, "print", ViewData); – Hcabnettek

2

Оператор using на StreamWriter также будет закрывать базовый поток. Извлеките инструкцию using на номер StreamWriter, чтобы сохранить поток.
Другим вариантом является возврат байтового массива, а не потока памяти.

return ms.ToArray(); 
+0

Поток 'ms' не присоединен к помощи блока; почему закрытие streamwriter или htmltextwriter влияет на состояние потока памяти? –

+1

@DavidLively Хорошо, вот как работает StreamWriter. Почему ты собираешься спросить у МС. – Magnus

+0

+1 a) Исправьте запись потока. б) На самом деле нет смысла возвращать поток, потому что ничего не транслируется. Использование 'GetBuffer()' немного более эффективно, хотя – jgauffin

-1

У вас есть 2 usings он говорит положил возвращение внутри Outter использованием()

как этот

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

 Смежные вопросы

  • Нет связанных вопросов^_^