2010-11-10 75 views
2

我正在導航菜單上工作。
我已經創建了ServerControl下面,它的工作原理,但我想讓用戶在我的ServerControl標籤內添加一些標準的ASP.NET控件,如label,image等等。在ServerControl標籤中添加子控件?

<MdsMenu:ServerControlMenu ID="ServerControlMenu1" runat="server"> 
    <MdsMenu:animation AnimationSpeed="Normal" AnimationType="Opacity_Height" Delay="1000" DropShadow="true" /> 
    <!-- HERE HAS TO HAVE SOME STANDARD ASP.NET CONTROLS --> 
    <!-- e.g <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> --> 
    </MdsMenu:MenuItem> 
</MdsMenu:ServerControlMenu> 

我的問題是在這裏,我怎麼可以在<MdsMenu:MenuItem>得到子控件和顯示他們喜歡,因爲他們是在輸出中。

P.S:
我覆蓋RenderContents方法

protected override void RenderContents(HtmlTextWriter output) 
{ 
    output.Write(OutPutStringBuilder.ToString()); 
} 

回答

10

我想你就只能代表該<MdsMenu:MenuItem/>標記的類丟[ParseChildren(false), PersistChildren(true)]。在標籤內寫入的子控件應該在運行時在控件的Controls屬性中可用。

更新:我把一個快速測試項目扔在一起,以證明這實際上起作用。 (顯然,人們都喜歡,而無需實際評估的答案是否正確,以downvote)。

這種自定義控件有你所期望的行爲:

[ParseChildren(false), PersistChildren(true)] 
public partial class SuperDiv : System.Web.UI.UserControl 
{ 
    public override void RenderControl(HtmlTextWriter writer) 
    { 
     writer.Write("<div class=\"super\">"); 
     writer.Write(Controls.Count); 

     foreach (Control i in Controls) 
      i.RenderControl(writer); 

     writer.Write("</div>"); 
    } 
} 

所以下面的ASP.NET標記:

<test:SuperDiv runat="server"> 
    <asp:Label runat="server">Hello, World!</asp:Label> 
</test:SuperDiv> 

將導致下面的HTML渲染:

<div class="super">3 
    <span>Hello, World!</span> 
</div> 

(3,因爲只含有空格的兩個文本節點也是控制的孩子,以及標籤。)

+0

可以爲您提供可能的一篇文章關於爲什麼添加「[ParseChildren(false),PersistChildren(true)]」是解決方案,它似乎是一個晦澀的解​​決方案。 – Letseatlunch 2010-11-16 02:11:26

+2

@Letseatlunch - 請參閱文檔的註釋部分:http://msdn.microsoft.com/en-us/library/system.web.ui.persistchildrenattribute.aspx PersistChildrenAttribute與ParseChildrenAttribute結合使用來確定嵌套控件的內容被解釋。如果PersistChildrenAttribute爲true並且ParseChildrenAttribute爲false,則包含在ASP.NET服務器控件中的嵌套內容將作爲控件持久化。如果PersistChildrenAttribute爲false且ParseChildrenAttribute爲true,則嵌套的內容將作爲服務器控件的屬性持久化。 – 2010-11-16 11:37:05

+0

這個解決方案似乎可以工作,除非不處理這些東西<%= String.Format(「{0} .blah」,「091」)%>或者純文本 – Letseatlunch 2010-11-17 00:45:45

1

你需要讓你的Web控件充當容器(如面板控制)

只需添加下面的屬性顯示到你的web用戶控件類

[ParseChildren(false)] 
    [PersistChildren(true)] 
    [Designer(typeof(PanelDesigner))] 
    public class MyOwnControl:WebControl 
    { 




    } 

然後在.aspx頁面上,你將能夠做到以下:

<cc1:MyOwnControl ID="MyOwnControl1" runat="server"> 
     <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
    </cc1:MyOwnControl> 
相關問題