【发布时间】:2012-07-24 09:01:18
【问题描述】:
之前有人问过这个问题
- Web Forms :: Design Time Support For Custom Templated User Control In VS 2008
- VS 2008 Using the ITemplate in a UserControl and getting a design time rendoring error
- how to show the controls for web user control in design time?
- UserControl ITemplate Property Design Time Error - Easy for a Guru...
不过再问也无妨:
如何在 ASP.net 中将模板添加到
UserControl?
到目前为止没有什么效果
-
从一个新的
UserControl5 开始,我将其称为Contoso:public partial class Contoso: System.Web.UI.UserControl { }这将允许我们使用新控件:1
<Contoso> Stuff in here <Contoso> -
创建
ITemplate类型的公共ContentTemplate属性: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 显示错误:
创建控件时出错 - 破解器
类型“System.Web.UI.UserControl”没有名为“ContentTemplate”的公共属性
这是有道理的,因为 UserControl 没有名为 ContentTemplate 的公共属性 - 所以我很难责怪它。
系列
这个问题是 Stackoverflow 系列中的一个,“模板化用户控件”:
- How to add a Templating to a UserControl?
- How to inherit from Control, rather than UserControl?
- UserControl has IsPostBack, but Control does not
- UserControl does not have public property named ContentTemplate
- How do i specify CodeFileBaseClass from web.config?
阅读奖励
- How to: Create Templated ASP.NET User Controls
- Creating a Templated User Control with ASP.Net 2.0
- Templated User Controls in ASP.NET for Better Maintainability
脚注
- 1 你永远不能使用那种语法。这只是一种易于阅读和理解的形式。
- 2 没有人知道要添加什么属性,或者为什么。为口味添加或多或少的属性。
- 3 未完成。完成了 UserControl,但不是我们的工作。
- 4 未完成;它不起作用。
- 5 在网站中(不是 Web 应用程序,不是在单独的程序集中)
【问题讨论】:
-
如果您将脚注内嵌在文本中会更容易阅读,向下滚动只是为了阅读注释很烦人
-
@Jupaol 脚注没有添加任何与问题相关的内容,只是为了防止那些想要挑剔不重要细节的挑剔者。用这种无关紧要的废话乱扔问题是一种耻辱。
标签: asp.net user-controls templating webusercontrol