[英]How can I make the ASP.Net Login control render correctly in Internet Explorer 7?
[英]ASP.NET MVC: How can I render a Control to a Stream?
所以我在内存中渲染局部视图,以便将视图中的XSL-FO数据定向到PDF渲染器。
PDF渲染器可以将字符串,XmlDocument或Stream作为输入。
这是我想做的事情:( 为清晰起见编辑 )
解决方案取自: http : //thriftybliss.spaces.live.com/blog/cns!58DA805F37F31F20!170.entry?wa = newsign1.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,或者我只是搞砸了其他东西。
如果我用StringWriter替换StreamWriter它工作正常,但是我不能使用StringWriter,因为当我调用.ToString()时,我得到各种各样的转义字符,搞乱了XSL-FO并且渲染器抛出了“非法字符”异常。
我通过创建一个XmlDocument并将字符串加载到其中来解决这个问题,但这似乎是一种非常迂回的做事方式。 我真的只想捕获HtmlTextWriter的输出并将其直接输入到渲染器中。 有没有办法做到这一点?
谢谢!
当你说“HtmlTextWriter似乎不想写入StreamWriter”时,这是否意味着driver.Render
无法从inStream获取任何字节? 我能想到的两种可能性......
首先,HtmlTextWriter在完成写入后不会刷新流,在这种情况下,在将inStream传递给driver.Render
之前,可能需要一个sw.Flush()
。
其次是在写入MemoryStream之后,位置指针将位于流的末尾,并且任何从它读取的尝试都将产生零字节(因为它在最后)。
在这种情况下,将inStream.Position
设置为0,或在调用driver.Render
之前调用inStream.Seek(0, SeekOrigin.Begin)
应该修复它。
我之前几次遇到过第二种情况,所以这是我最好的猜测。
我还没有测试过这个。 ..但它是我在其他地方制作和使用的RenderViewToString方法的修改版本:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.