RenderControl不输出子控件HTML

时间:2013-02-22 17:03:13

标签: c# asp.net aspose

我在这里遇到了一个复杂的问题。

上下文: 我正在编辑一个表单引擎项目,它根据每个请求的XML定义动态创建它的控件,使用Aspose.PDF添加PDF生成功能。简而言之,表单引擎作为一组控件,作为填写表单(文本框,电话号码,日期控件等)的基本功能,每个控件及其属性在xml文件中定义,并对应于xml架构。现在,当表单完成时,有一个formRepeater控件,用于检索先前填充的页面并格式化数据以便在Web浏览器中打印。我必须将其替换为生成pdf文件。

我做了什么: 我添加了一个名为GeneratePdf的新抽象方法,所有FormControl都必须实现,我为我的控件容器PreRender事件中的每个控件和子控件调用此方法。该方法将根据每个控件而有所不同,但这里是现在基本的

    public override void GeneratePdf(Aspose.Pdf.Generator.Pdf file)
    {

        //Add the control HTML in a new section of the PDF File
        var section = file.Sections.Add();
        var sb = new StringBuilder();
        var writer = new HtmlTextWriter(new StringWriter(sb));
        this.RenderControl(writer);
        var html = new Aspose.Pdf.Generator.Text(section, sb.ToString());
        html.IsHtmlTagSupported = true;
        section.Paragraphs.Add(html);
    }

我的问题: 我正在使用Stringbuilder成功检索我的控件的HTML,但如果控件作为标准ASP.NET控件在其中,则不会呈现子控件的HTML。为什么呢?

谢谢,

1 个答案:

答案 0 :(得分:2)

RenderControl将子控件HTML呈现为sb字符串编写器。

但是,http://www.aspose.com/docs/display/pdfnet/Text+Constructor+Overload_3 Aspose Text不会自动为每个子控件创建段。它期望传递给它的字符串是单个(和当前)段。

要添加控件的子控件,您需要递归调用/生成每个子控件。因此,您需要重新构建上面的代码。