这个问题之前有人问过
- Web 表单 :: VS 2008 中自定义模板化用户控件的设计时支持
- VS 2008 在 UserControl 中使用 ITemplate 并获得设计时渲染错误
- 如何在设计时显示 Web 用户控件的控件?
- UserControl ITemplate 属性设计时间错误 - 对大师来说很容易......
但再问一次也无妨:
如何
UserControl在 ASP.net 中添加模板?
到目前为止没有什么效果
从一个新的
UserControl5开始,我称之为Contoso:public partial class Contoso: System.Web.UI.UserControl { }这将允许我们使用新控件:1
<Contoso> Stuff in here <Contoso>创建
ContentTemplate类型的公共属性ITemplate:public partial class Contoso: System.Web.UI.UserControl { public ITemplate ContentTemplate { get; set; } }并向属性添加不确定数量的属性
ContentTemplate:2//[ParseChildren(true)] [ParseChildren(true, "ContentTemplate")] //[ParseChildren(false)] public partial class Contoso: System.Web.UI.UserControl { [TemplateContainer(typeof(ContentContainer))] [TemplateInstance(TemplateInstance.Single)] [PersistenceMode(PersistenceMode.InnerProperty)] //[PersistenceMode(PersistenceMode.InnerDefaultProperty)] [Browsable(true)] //[Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] //[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ITemplate ContentTemplate { get; set; } }这将允许我们添加
<ContentTemplate>到我们的 aspx 文件中的控件:1<Contoso> <ContentTemplate> Stuff in here </ContentTemplate> </Contoso>接下来我们需要通过在某处添加它来实际使用这些
ContentTemplate东西。我们通过将它添加到我们的 UserControl 的内部div元素之一来做到这一点。从我们
.aspx最初为空的文件开始:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>div我们添加一个将保存我们的ContentTemplate东西的父母:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %> <div id="ContentDiv" runat="server"></div>然后我们在控件的Init
ContentTemplate期间将这些东西填充到该父级中:divpublic partial class Contoso: System.Web.UI.UserControl { protected override void OnInit(EventArgs e) { base.OnInit(e); //If there's content, then put it into our ContentDiv div if (this.ContentTemplate != null) this.ContentTemplate.InstantiateIn(ContentDiv); } [PersistenceModeAttribute(PersistenceMode.InnerProperty)] [TemplateInstanceAttribute(TemplateInstance.Single)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ITemplate ContentTemplate { get; set; } }编辑:表明您的类实现
INamingContainer:public partial class Contoso: System.Web.UI.UserControl: INamingContainer { protected override void OnInit(EventArgs e) { base.OnInit(e); //If there's content, then put it into our ContentDiv div if (this.ContentTemplate != null) this.ContentTemplate.InstantiateIn(ContentDiv); } [PersistenceModeAttribute(PersistenceMode.InnerProperty)] [TemplateInstanceAttribute(TemplateInstance.Single)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public ITemplate ContentTemplate { get; set; } }该
INamingContainer接口没有任何成员,仅用于将您的UserControl类标记为某物。我们完成了3。我们现在可以在我们的 aspx 页面中使用这个控件。但首先我们需要在我们的 aspx 页面顶部“注册”它:
<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %>在哪里:
Contoso.ascx是ascx文件名Contoso是我们将用来引用此用户控件的元素的名称uc是我们必须放在前面的一些文本uc:Contoso(我uc用作user-control的缩写)
将控件添加到我们的页面:
<uc:Contoso ID="Crackers" runat="server"> <ContentTemplate> Stuff goes here </ContentTemplate> </qwerty:Contoso>
我们完成了!4
编辑:忘记添加上述不起作用的原因。Visual Studio 显示错误:
创建控件时出错 - Crackers
类型“System.Web.UI.UserControl”没有名为“ContentTemplate”的公共属性

这是有道理的,因为UserControl没有一个名为的公共财产ContentTemplate——所以我很难责怪它。
系列
这个问题是正在进行的 Stackoverflow 系列“模板化用户控件”中的一个:
- 如何将模板添加到用户控件?
- 如何从 Control 继承,而不是 UserControl?
- UserControl 有 IsPostBack,但 Control 没有
- UserControl 没有名为 ContentTemplate 的公共属性
- 如何从 web.config 指定 CodeFileBaseClass?
奖金阅读
脚注
- 1你永远不能使用那种语法。这只是一种易于阅读和理解的形式。
- 2没有人知道要添加什么属性,或者为什么。添加或多或少的属性来品尝。
- 3未完成。完成了 UserControl,但不是我们的工作。
- 4未完成;它不起作用。
- 5在网站中(不是 Web 应用程序,不是在单独的程序集中)

