【问题标题】:How can I render children tags in a custom server control?如何在自定义服务器控件中呈现子标签?
【发布时间】:2011-05-11 05:50:22
【问题描述】:

我正在开发一个自定义 ServerControl,我已经创建了它,如下所示:

[ParseChildren(true), PersistChildren(true)]
[ToolboxData("<{0}:Menu runat=\"server\"></{0}:Menu>")]
public class Menu : WebControl
{ 
    .....

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public MenuItem MenuItems { get; set; }
}

[ParseChildren(true), PersistChildren(true)]
public class MenuItem : WebControl
{ 
    ...... 

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public MenuItem SubMenuItems
    {
        get
        {
            if (_SubMenuItems == null) return new MenuItem();
            return _SubMenuItems;
        }
        set
        {
            _SubMenuItems = value;
        }
    }
    private MenuItem _SubMenuItems;

    [TemplateContainer(typeof(MenuItem))]
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Template { get; set; }
}

<%@ Register Assembly="JQueryMenu" Namespace="JQueryMenu" TagPrefix="MdsMenu" %>
<MdsMenu:Menu ID="Menu1" runat="server">
    <AnimationItems AnimationSpeed="Fast" AnimationType="Opacity_Height" DropShadow="true"
        Delay="1000" />
    <MdsMenu:MenuItem ID="MenuItem1" runat="server" Text="MenuItem 01">
        <MdsMenu:MenuItem runat="server">
            <Template>
                <asp:Button ID="Button1" runat="server" Text="Button" />
                <asp:CheckBox ID="CheckBox1" runat="server" />
            </Template>
        </MdsMenu:MenuItem>
    </MdsMenu:MenuItem>
    <MdsMenu:MenuItem ID="MenuItem2" runat="server" Text="MenuItem 01">
        <MdsMenu:MenuItem ID="MenuItem3" runat="server">
            <Template>
                <asp:Button ID="Button2" runat="server" Text="Button" />
                <asp:CheckBox ID="CheckBox2" runat="server" />
            </Template>
            <MdsMenu:MenuItem ID="MenuItem5" runat="server" Text="MenuItem 05">
            </MdsMenu:MenuItem>
            <MdsMenu:MenuItem ID="MenuItem6" runat="server" Text="MenuItem 06">
            </MdsMenu:MenuItem>
            <MdsMenu:MenuItem ID="MenuItem4" runat="server">
                <Template>
                    <asp:Image ID="Image1" runat="server" />
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                </Template>
            </MdsMenu:MenuItem>
        </MdsMenu:MenuItem>
    </MdsMenu:MenuItem>
</MdsMenu:Menu>

现在,我如何解析它并在RenderContent 方法中渲染它? !!! 下面的方法总是抛出第一个异常,这意味着this.Controls总是空的!!!
我该怎么做以及如何访问 RenderControl 方法中的嵌套子级?

public class Menu : WebControl
{
    ....

    public override void RenderControl(HtmlTextWriter output)
    { 
        if (!this.HasControls())
           throw new Exception("Controls are empty");
        ....
    }
}

【问题讨论】:

  • 嘿,你能告诉我你的建筑的其余部分吗?我在做类似的事情我在 MenuItem 的集合部分遇到问题,在你有子项集合的地方设置

标签: c# asp.net controls menu servercontrols


【解决方案1】:

改变

[ParseChildren(true)]

[ParseChildren(false)]

true 表示您希望将子项解析为您的类的属性/属性,而不是子项。

【讨论】:

  • 谢谢,Template 怎么样,我想在Template 中渲染一些控件。我该怎么做?
  • 啊,我误会了。大概您正在将Template 属性设置为某个新对象,是吗?这是你写的控件吗?如果是这样,您可以将这种类型的定义添加到您的问题中吗?
  • 不,我在Template 标签中使用标准控件,我想像往常一样渲染它们。但是我想渲染上面的asp.net代码,我的意思是MdsMenu:MenuItem标签。
  • 对,但是您在代码中将 Template 属性设置为什么?我假设您必须将其设置为 &lt;Template&gt;...&lt;/Template&gt; 标记才能工作。
  • 这是我的Template 属性:[TemplateContainer(typeof(MenuItem))] [PersistenceMode(PersistenceMode.InnerProperty)] public ITemplate Template { get; set; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2012-11-09
  • 2021-05-04
  • 2012-10-12
相关资源
最近更新 更多