我希望有人可以对创建服务器控件、控件基类和这些类的用法的主题有所了解。
这是我想要实现的一个例子。我想创建一个可以在 ASPX 标记中实例化的自定义面板控件,如下所示:
<acme:Panel ID="MyPanel" runtat="server" Scrolling="true">
<Header>My Panel Header</Header>
<Toolbars>
<acme:Toolbar ID="Toolbar1" runat="server"/>
<acme:Toolbar ID="Toolbar2" runat="server"/>
</Toolbars>
<Contents>
<%-- Some Content for the Contents section --%>
</Contents>
<Footer>
<%-- Some Content for the Footer section --%>
</Footer>
</acme:Panel>
它应该呈现以下 HTML:
<div id="MyPanel" class="panel scroll-contents">
<div class="panel-header">
<div class="panel-header-l"></div>
<div class="panel-header-c">
<div class="panel-header-wrapper">My Panel Header</div>
</div>
<div class="panel-header-r"></div>
</div>
<div class="panel-toolbars">
// HTML of Toolbar control
</div>
<div class="panel-body">
<div class="panel-body-t">
<div class="panel-body-tl"></div>
<div class="panel-body-tc"></div>
<div class="panel-body-tr"></div>
</div>
<div class="panel-body-m">
<div class="panel-body-ml"></div>
<div class="panel-body-mc">
<div class="panel-body-wrapper">
// Contents
</div>
</div>
<div class="panel-body-mr"></div>
</div>
<div class="panel-body-b">
<div class="panel-body-bl"></div>
<div class="panel-body-bc"></div>
<div class="panel-body-br"></div>
</div>
</div>
<div class="panel-footer">
<div class="panel-footer-l"></div>
<div class="panel-footer-c">
<div class="panel-footer-wrapper">
// Footer contents
</div>
</div>
<div class="panel-footer-r"></div>
</div>
</div>
开发人员应该能够省略除 Contents 部分之外的任何部分。不应呈现省略部分的 HTML。另外,用户应该能够在页面后面的代码中实例化/添加 Panel 控件,并向 Panel 控件的各个部分添加其他控件,如下所示:
ACME.Panel MyPanel = new ACME.Panel();
MyPlaceHolder.Controls.Add(MyPanel);
MyPanel.Header = "My Panel Header";
MyPanel.Toolbars.Controls.Add(new ACME.Toolbar());
MyPanel.Footer.Controls.Add(new Literal());
MyPanel.Contents.Controls.Add(new GridView());
我已阅读以下文章:通信部门对话:创作自定义 ASP.NET 服务器控件(哪个基类?)
由于我真的不希望开发人员更改控件的样式,因此 System.Web.UI.Control 基类就足够了,但我还需要应用 INamingContainer 接口。因此我的控制应该是这样的:
using System.Web;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Security.Permissions;
namespace ACME
{
[ToolboxData("<{0}:Panel runat=server></{0}:Panel >")]
[ParseChildren(true)]
public class Panel : Control, INamingContainer
{
private string _header;
private ITemplate _toolbars;
private ITemplate _contents;
private ITemplate _footerContents;
public DialogBox()
{
}
[Browsable(false),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual ITemplate Toolbars
{
get { return _toolbars; }
set { _toolbars = value; }
}
[Browsable(false),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual ITemplate Contents
{
get { return _contents; }
set { _contents= value; }
}
[Browsable(false),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual ITemplate Footer
{
get { return _footerContents; }
set { _footerContents = value; }
}
}
}
我已经阅读了很多教程,但它们要么没有涵盖我的预期实现,要么没有解释为什么采用某种方法。他们也让我很困惑,以至于我求助于 JavaScript 来动态呈现必要的 HTML。如果那里有任何控制大师,您能否解释一下您将如何完成这项任务?