2010-08-30 4 views
3

Итак, я представляю частичный вид в памяти, чтобы направлять данные XSL-FO в представление в средство визуализации PDF.ASP.NET MVC: как я могу визуализировать элемент управления потоком?

Средство рендеринга PDF может принимать строку, XmlDocument или Stream в качестве входных данных.

Вот что я хотел бы сделать: (Отредактировано для ясности)

Solution взяты из: http://thriftybliss.spaces.live.com/blog/cns!58DA805F37F31F20!170.entry?wa=wsignin1.0&sa=362921628

var viewPage = new ViewPage(); 
var viewData = new ViewDataDictionary(model); 
viewPage.ViewData = viewData; 

var control = viewPage.LoadControl(viewName); 
viewPage.Controls.Add(control); 

using (var inStream = new MemoryStream()) 
{ 
    using (var sw = new StreamWriter(inStream)) 
    { 
     using (var tw = new HtmlTextWriter(sw)) 
     { 
      viewPage.RenderControl(tw); 
     } 
     using (var outStream = new MemoryStream()) 
     { 
      driver.Render(inStream, outStream); 
      return outStream.ToArray(); 
     } 
    } 
} 

Вот что работает, но то, что я предпочел бы не делать:

var sb = new StringBuilder(); 

using (var sw = new StringWriter(sb)) 
{ 
    using (var tw = new HtmlTextWriter(sw)) 
    { 
     vp.RenderControl(tw); 
    } 
} 

var xml = new XmlDocument(); 
xml.LoadXml(sb.ToString()); 

using (var ms = new MemoryStream()) 
{ 
    driver.Render(xml, ms); 
    return ms.ToArray(); 
} 

к сожалению, HtmlTextWriter, кажется, не хочет писать в StreamWriter, или, возможно, я просто испортил что-то еще.

Если я заменю StreamWriter на StringWriter, он отлично работает, но я не могу использовать StringWriter, потому что, когда я вызываю .ToString(), я получаю всевозможные escape-символы, которые испортили XSL-FO, а рендеринг бросает «Незаконный Исключение составляют символы.

Я обошел это, создав XmlDocument и загрузив в него строку, но это похоже на очень окольный способ делать вещи. Я просто хотел бы просто захватить вывод из HtmlTextWriter и передать его прямо в Renderer. Есть какой-либо способ сделать это?

Спасибо!

ответ

1

Когда вы говорите «HtmlTextWriter, кажется, не хочет писать в StreamWriter» это означает, что driver.Render не может получить любые байты из inStream? Два варианта я могу думать ...

Первое, что HtmlTextWriter не промывка потока после того, как это сделано письменно, в этом случае вам могут понадобиться в там sw.Flush(), прежде чем передать Instream в driver.Render.

Во-вторых, после записи в MemoryStream указатель местоположения будет находиться в конце потока, и любые попытки чтения из него будут давать нулевые байты (поскольку они находятся в конце).

В этом случае установка inStream.Position на 0 или вызов inStream.Seek(0, SeekOrigin.Begin) перед вызовом driver.Render должен исправить это.

Я несколько раз сталкивался со второй ситуацией, так что это мое лучшее предположение.

+0

Спасибо! Вот и все.Поступая с отладчиком, я не знал, почему длина inStream равна 0 после рендеринга Control. После промывки StreamWriter длина inStream считывает правильную длину и устанавливает положение на 0, прежде чем читать отлично работает. Еще раз спасибо! –

-1

Я НЕ тестировал это ВСЕ. .. но это модифицированная версия RenderViewToString method, что я сделал и использовать в другом месте:

public static Stream RenderViewToStream<T>(string viewPath, T model, ControllerContext controllerContext) 
    { 
     var ms = new MemoryStream(); 
     using (var writer = new StreamWriter(ms)) 
     { 
      var view = new WebFormView(viewPath); 
      var vdd = new ViewDataDictionary<T>(model); 
      var viewCxt = new ViewContext(controllerContext, view, vdd, new TempDataDictionary(), writer); 
      viewCxt.View.Render(viewCxt, writer); 
     } 
     return ms; 
    } 
+0

Спасибо за ответ, но я пытаюсь реализовать свое решение по строкам этого сообщения: http://thriftybliss.spaces.live.com/blog/cns!58DA805F37F31F20!170.entry?wa=wsignin1. 0 & sa = 362921628 Я бы хотел избежать использования ControllerContext, так как я могу просто визуализировать частичный вид без него. Единственная проблема - форматирование вывода строки и что мне нужно сделать, чтобы обойти ее. –

+0

Кажется, что не работает для меня, и непроверенный не помогает. – Hcabnettek

+0

«непроверенный не помогает» .. Извините, Hcabnettek, позвольте мне просто сделать И проверить вашу работу за вас. –

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

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