如何在不从WebControl继承的控件中允许模板化控件?

时间:2015-10-28 21:05:58

标签: c# asp.net custom-controls

在所有examples of Templated server controls中,包含模板的类继承自CompositeControl类,该类本身继承自WebControl类。

在我的应用程序中,我想要use Templates in my Control,但也要从不同的类继承,该类不会从CompositeControlWebControl继承。

"模板"可能意味着一大堆事情,但我问这样的代码:

[
Browsable(false),
DefaultValue(null),
Description("The Template for the content of the Control"),
PersistenceMode(PersistenceMode.InnerProperty),
TemplateInstance(TemplateInstance.Single),
]
public ITemplate Content { get; set; }

和这样的ASP.NET代码:

<prefix:CustomControl ID="Control1" runat="server">
    <Content>
        <asp:Literal ID="ExampleContent" runat="server" Text="Look at me" />
    </Content>
</prefix:CustomControl>

但是,我注意到当我从WebControl类继承时,我对象中的ITemplate变量具有我期望的数据,而如果我不继承WebControl 1}},这些变量有NULL个数据。

如何使用模板变量,还可以从我选择的任何类继承?

1 个答案:

答案 0 :(得分:0)

当然,你必须继承Control类,但神奇的是ParseChildren属性。要使用模板变量,您必须将ParseChildren属性设置为true

[ParseChildren(true)] // Don't treat tags within the Control as properties, but as Controls
public class CustomControl : Control
{
    // ...
}

我在检查WebControl班级和reading more about the attribute后找到了这个。

ParseChildren属性指定如何解释ASP.NET代码,内部对象是否代表Controls(ParseChildren(false))或Properties(ParseChilren(true))。由于您的Template变量实际上是属性,因此您必须将ParseChildren属性设置为true。不幸的是,这也意味着您无法在ASP.NET代码中混合模板化和非模板化控件,如下所示:

<prefix:CustomControl ID="Control1" runat="server">
    <Content>
        <asp:Literal ID="ExampleContent" runat="server" Text="Look at me" />
    </Content>
    <asp:Literal ID="ControlNonTemplate" runat="server" Text="This will not work (Parser error)" />
</prefix:CustomControl>