gpt4 book ai didi

ASP.NET MVC : How can I render a Control to a Stream?

转载 作者:行者123 更新时间:2023-12-04 06:46:17 25 4
gpt4 key购买 nike

所以我在内存中渲染部分 View ,以便将 View 中的 XSL-FO 数据定向到 PDF 渲染器。

PDF 渲染器可以将字符串、XmlDocument 或 Stream 作为输入。

这是我想做的:(为清楚起见进行了编辑)

解决方案取自: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,或者也许我只是搞砸了其他事情。

如果我用 StringWriter 替换 StreamWriter,它工作正常,但我不能使用 StringWriter,因为当我调用 .ToString() 时,我得到各种转义字符,这些字符弄乱了 XSL-FO,渲染器抛出“非法字符” "异常。

我通过创建一个 XmlDocument 并将字符串加载到其中来解决这个问题,但这似乎是一种非常迂回的做事方式。我真的只想捕获 HtmlTextWriter 的输出并将其直接提供给渲染器。有什么办法吗?

谢谢!

最佳答案

当您说“HtmlTextWriter 似乎不想写入 StreamWriter”时,这是否意味着 driver.Render无法从 inStream 中获取任何字节?我能想到的两种可能性...

首先是 HtmlTextWriter 在完成写入后不会刷新流,在这种情况下您可能需要 sw.Flush()在你把 inStream 交给 driver.Render 之前.

其次,在写入 MemoryStream 后,位置指针将位于流的末尾,任何从中读取的尝试都将产生零字节(因为它位于末尾)。

在这种情况下,设置 inStream.Position到 0,或调用 inStream.Seek(0, SeekOrigin.Begin)打电话前driver.Render应该修复它。

第二种情况我之前遇到过几次,所以这是我最好的猜测。

关于ASP.NET MVC : How can I render a Control to a Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3602491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com