这个问题之前有人问过
- Web 表单 :: VS 2008 中自定义模板化用户控件的设计时支持
- VS 2008 在 UserControl 中使用 ITemplate 并获得设计时渲染错误
- 如何在设计时显示 Web 用户控件的控件?
- UserControl ITemplate 属性设计时间错误 - 对大师来说很容易......
但再问一次也无妨:
如何
UserControl
在 ASP.net 中添加模板?
到目前为止没有什么效果
从一个新的
UserControl
5开始,我称之为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
期间将这些东西填充到该父级中:div
public 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 应用程序,不是在单独的程序集中)