0

我建立我这自CompositeControl控制HTML控件

继承

的原因控制是能够对多个在线一致的内容区域(HTML元素)第一自定义服务器控件我们开发的应用程序。的

因此而不必经常打出来:

<div class="titleBar"> 
</div> 
<div class="actionBar"> 
</div> 
<div class="workspace"> 
</div> 

的开发人员可以添加如下服务器控制:

<custom:Workspace id="..." runat="server" Title="MyTitle"> 
    <TitleBar> 
     Here is the title 
    </TitleBar> 
    <ActionBar> 
     <asp:button id="..." runat="server" Title="MyButton" /> 
    </ActionBar> 
    <Content> 
     <asp:DataGrid id="..." runat="server" /> 
    </Content> 
</custom:Workspace> 

我读的文章在http://msdn.microsoft.com/en-us/library/ms178657.aspx和它的作品,但问题是......我不明白为什么。 (有没有人有链接到一篇文章的外行人的版本,描述如何建立这些类型的服务器控件?)

我注意到的主要事情到目前为止,是Asp.net呈现一堆SPAN元素,其中当然我不想要。

如何控制新的CompositeControl输出的HTML?

感谢, 雅克

PS。这里是我到目前为止的代码:

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Security.Permissions; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.Design; 
namespace TemplatedServerControl 
{ 
    [DefaultProperty("Title")] 
    [ToolboxData("<{0}:Workspace runat=server></{0}:Workspace>")] 
    public class Workspace : CompositeControl 
    { 
     #region FIELDS 
     private ITemplate _TitleBarTemplateValue; 
     private ITemplate _ActionBarTemplateValue; 
     private TemplateOwner _TitleBarOwnerValue; 
     private TemplateOwner _ActionBarOwnerValue; 
     #endregion 
     #region PROPERTY - TitleBarOwner 
     [Browsable(false), 
     DesignerSerializationVisibility(
     DesignerSerializationVisibility.Hidden)] 
     public TemplateOwner TitleBarOwner 
     { 
      get 
      { 
       return _TitleBarOwnerValue; 
      } 
     } 
     #endregion 
     #region PROPERTY - ActionBarOwner 
     [Browsable(false), 
     DesignerSerializationVisibility(
     DesignerSerializationVisibility.Hidden)] 
     public TemplateOwner ActionBarOwner 
     { 
      get 
      { 
       return _ActionBarOwnerValue; 
      } 
     } 
     #endregion 
     #region PROPERTY - Title 
     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("[Provide the title for the workspace]")] 
     [Localizable(true)] 
     public string Title 
     { 
      get 
      { 
       String s = (String)ViewState["Title"]; 
       return ((s == null) ? "[" + this.ID + "]" : s); 
      } 

      set 
      { 
       ViewState["Text"] = value; 
      } 
     } 
     #endregion 
     #region PROPERTY - TitleBar 
     [Browsable(false), 
     PersistenceMode(PersistenceMode.InnerProperty), 
     DefaultValue(typeof(ITemplate), ""), 
     Description("Control template"), 
     TemplateContainer(typeof(Workspace))] 
     public virtual ITemplate TitleBar 
     { 
      get 
      { 
       return _TitleBarTemplateValue; 
      } 
      set 
      { 
       _TitleBarTemplateValue = value; 
      } 
     } 
     #endregion 
     #region PROPERTY - ActionBar 
     [Browsable(false), 
     PersistenceMode(PersistenceMode.InnerProperty), 
     DefaultValue(typeof(ITemplate), ""), 
     Description("Control template"), 
     TemplateContainer(typeof(Workspace))] 
     public virtual ITemplate ActionBar 
     { 
      get 
      { 
       return _ActionBarTemplateValue; 
      } 
      set 
      { 
       _ActionBarTemplateValue = value; 
      } 
     } 
     #endregion 
     #region METHOD - CreateChildControls() 
     protected override void CreateChildControls() 
     { 
      //base.CreateChildControls(); 
      Controls.Clear(); 

      _TitleBarOwnerValue = new TemplateOwner(); 
      _ActionBarOwnerValue = new TemplateOwner(); 

      ITemplate temp1 = _TitleBarTemplateValue; 
      ITemplate temp2 = _ActionBarTemplateValue; 

      temp1.InstantiateIn(_TitleBarOwnerValue); 
      temp2.InstantiateIn(_ActionBarOwnerValue); 

      this.Controls.Add(_TitleBarOwnerValue); 
      this.Controls.Add(_ActionBarOwnerValue); 
     } 
     #endregion 
     #region METHOD - RenderContents(HtmlTextWriter writer) 
     protected override void RenderContents(HtmlTextWriter writer) 
     { 
      base.RenderContents(writer); 
     } 
     #endregion 
    } 

    [ToolboxItem(false)] 
    public class TemplateOwner : WebControl 
    { 
    } 
} 

回答

1

额外<span>元素从TemplateOwner控制来,因为一个WebControl(其中TemplateOwner从继承)呈现<span>标签默认。你可以改变TemplateOwner指定标签来显示:

public class TemplateOwner : WebControl 
{ 
    public TemplateOwner() : 
     base(HtmlTextWriterTag.Div) 
    { 
    } 
} 

但你并不需要创建自己的类以使用模板。例如,您可以使用Panel控件:

private Panel _TitleBarPanel; 
private Panel _ActionBarPanel; 

protected override void CreateChildControls() 
{ 
    _TitleBarPanel = new Panel { CssClass = "titleBar" }; 
    _TitleBarTemplateValue.InstantiateIn(_TitleBarPanel); 
    this.Controls.Add(_TitleBarPanel); 

    _ActionBarPanel = new Panel { CssClass = "actionBar" }; 
    _ActionBarTemplateValue.InstantiateIn(_ActionBarPanel); 
    this.Controls.Add(_ActionBarPanel); 
} 
+0

感谢迈克尔真的欣赏它编程控制。我会试一试。你有没有机会链接到一个教程,将更详细地解释复合控件和模板? – Jacques 2012-04-05 07:13:38

+0

我不知道任何关于我头顶的物品。如果您有更多问题,请随时询问。 :-) – 2012-04-05 13:44:42

0

一个简单的解决方案,我们使用PlaceHolder控件。 与CompositeControl类似,这是一个容器控件。 但与CompositeControl不同的是,它根本不呈现任何内容 - 不包含任何内容或标记。

这意味着你不能以编程方式引用整个控件,就像你可以使用CompositeControl一样,但取决于你在做什么,这可能不是必需的。

每个子控件都会有一个唯一的ID,因此,您可以参考的孩子(与事件等的交易)