自定义模板控件

<%@ Control Language="C#" %>

<script runat="server">
[TemplateContainer(
typeof(MyTemplateContainer))]
[PersistenceMode(PersistenceMode .InnerProperty)]
public ITemplate 内容 { get; set; }

[TemplateContainer(
typeof(MyTemplateContainer))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate 广告 { get; set; }

public class MyTemplateContainer : Control, INamingContainer
{
public MyTemplateContainer(string ID)
{
this.ID = ID;
}
}

protected override
void CreateChildControls()
{
base.CreateChildControls();
this.PlaceHolder1.Controls.Clear();
if (this.内容 != null)
{
MyTemplateContainer c
= new MyTemplateContainer("content1");
this.内容.InstantiateIn(c);
this.PlaceHolder1.Controls.Add(c);
};
this.PlaceHolder2.Controls.Clear();
if (this.广告 != null)
{
MyTemplateContainer c
= new MyTemplateContainer("content2");
this.广告.InstantiateIn(c);
this.PlaceHolder2.Controls.Add(c);
}
}
</script>

<table width="100%">
<tr>
<td>
内容:
<br />
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</td>
<td>
<asp:PlaceHolder ID="PlaceHolder2" runat="server"></asp:PlaceHolder>
</td>
</tr>
</table>


将这个ascx放入网站,然后“生成/编译 网站”。之后,你就可以在页面中拖入它使用。当你在类似于

<uc1:TestContents ID="TestContents1" runat="server">
</uc1:TestContents>

中间按“ <"的时候,立刻看到智能感知显示两个模板供你使用。

masterpage只能让你为整个页面提供模板中内容,而自定义的用户控件则可以让你为用户控件中的小区域提供类似使用了mastpage的页面的同样的设计方式。这样,容器定义高层的布局设计,而将细节作为模板可以由使用者动态提供。


我的例子中,用户无需知道布局的table,只要设计两个模板中的界面就可以了。跟你的是一个意思。你的需求中,没有区分模板。而实际上应该这样写使用容器:

<uc1:TestContents ID="TestContents1" runat="server">
    <内容>
        <input type="text" />
    </内容>
    <广告>
        hello,这是广告词
    </广告>

</uc1:TestContents>


大量使用masterpage或者自定义的模板布局,可以让web应用程序界面变得特别整洁一致,一看就是大公司的产品。用户的“试探”着就可以自己学会许多重要操作,问题操作细节方法完全一致。

posted @ 2009-04-08 09:59  connoryan  阅读(358)  评论(1编辑  收藏  举报