ASP.NET RenderControl或RenderChildren失败

时间:2009-11-20 10:18:58

标签: asp.net rendercontrol

我需要使用objChildControl.RenderControl或objControl.RenderChildren手动渲染我的子控件。但看起来这些方法并不完整。

我的所有子控件都使用OnPreRender事件来注册clientscript和客户端样式表(因为这些只能在prerender事件中创建)。

我有两个主要问题,将当前的System.Web.UI.Page对象传递给子控件,并确保在这些子控件上触发OnPreRender事件。

似乎我不能在我的子控件上使用RenderControl方法,因为不会调用OnPreRender事件。 但是我可以通过objChildControl.Page = Me.Page

传递Page对象

当我使用RenderChildren时,我无法传递Page对象,或者我可以吗? 我不确定在使用RenderChildren时是否甚至调用了OnPreRender事件。

一些帮助将不胜感激,因为我被卡住了;)

更新

我找到了一种方法来获得我需要的结果,但这不是我想要的解决方案。 例如:

我想要的代码:

<wc:ParentControl id="objParent" runat="server" bla="etc">
<Content> <!-- This is an InnerProperty of the ParentControl --><DIV>bla bla bla bla.....<wc:SomeControl id="objSomeControl" runat="server" /><wc:3rdPartyControl id="obj3rdPartyControl" runat="server" /></DIV></Content>
</wc:ParentControl>

CodeBehind:objParentControl.Content.RenderControl(Writer)

然后上面提到的问题就会开始。如何确保为Content中的所有孩子调用OnPreRender?

运行良好的代码(但RenderControl方法无用):

<wc:ParentControl id="objParentControl" runat="server"></wc:ParentControl>
<wc:Content id="objContent" runat="server"><DIV>bla bla bla bla.....<wc:SomeControl id="objSomeControl" runat="server" /><wc:3rdPartyControl id="obj3rdPartyControl" runat="server" /></DIV></wc:Content>

然后只使用wc:Content控件的RenderBeginTag和RenderEndTag。 然后调用OnPreRender事件。 但是我不想通过使用InnerProperty将内容嵌入到parentcontrol中。 然后通过RenderControl或RenderChildren手动渲染子控件。

1 个答案:

答案 0 :(得分:2)

我有类似的问题。我不确定这是否与您遇到的问题相同,但我遇到的问题是我的容器控件上有ParseChildren(true)属性。因为ParseChildren是真的,所以子控件将被放入属性中,而不是放入包含控件的子控件集合中,并且永远不会调用它们的OnPreRender函数。

我最终覆盖了我的包含控件类中的CreateChildControls函数,在那里我添加了从我的解析集合到Controls集合的所有内容。因为我无论如何都要覆盖Render函数,所以当我不希望它们呈现时,我不担心Controls集合中的控件。

如下所示:

[ParseChildren(true, "MyKids")]
public class Example : Control {

    private ArrayList _kids = new ArrayList();

    public ArrayList MyKids {
        get { return _kids; }
        set { _kids = value; }
    }

    protected override CreateChildControls() {
        Controls.Clear();
        foreach(Control c in _kids)
            Controls.Add(c);
    }

    protected override Render(HtmlTextWriter writer) {
        ...
    }
}