asp.net – 如何添加一个模板到一个UserControl?
|
这个问题之前已经提过 > Web Forms :: Design Time Support For Custom Templated User Control In VS 2008 但不要再问这个问题:
到目前为止还没有工作 >从一个新的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" %> 我们添加一个将保留ContentTemplate内容的父div: <%@ 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; }
}
>编辑:指示您的类实现 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; }
}
<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %> 哪里: > Contoso.ascx是ascx文件的名称 >将控件添加到我们的页面: <uc:Contoso ID="Crackers" runat="server">
<ContentTemplate>
Stuff goes here
</ContentTemplate>
</qwerty:Contoso>
我们完成了! 编辑:忘记添加上述原因不行。 Visual Studio显示错误:
这是有道理的,因为UserControl没有名为ContentTemplate的公共属性 – 所以我很难怪它。 系列 这个问题是正在进行的Stackoverflow系列“模板用户控件”中的一个: > How to add a Templating to a UserControl? 奖金阅读 > How to: Create Templated ASP.NET User Controls 脚注 > 1你不能使用这种语法。这只是一个容易阅读和理解的形式。 解决方法我相信你几乎得到了。BTW。 UserControl不使用Visual Studio Designer呈现,但是当您运行应用程序时,该控件可以正常工作。如果您使用“服务器控件”,则在Visual Studio设计器中正确显示该控件时,这是不同的 以下代码非常适用于构建模板化用户控件和模板化服务器控件,但如果要添加绑定功能,则过程略有不同,take a look Download Source Code 这是创建一个模板的UserControl的代码。 简单输出 模板容器 public class MyTemplateContainer : Control,INamingContainer { }
ASPX代码背后 protected void Page_Load(object sender,EventArgs e)
{
// just to demonstrate using the contorl
this.WebUserControl1.Controls.Add(new LiteralControl("<br />new control"));
}
ASPX <%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %>
<uc1:WebUserControl ID="WebUserControl1" runat="server">
<ContentTemplate>
My Template<br />
<asp:Label Text='Hello People' runat="server" ID="lblMessage" />
</ContentTemplate>
</uc1:WebUserControl>
ASCX代码落后 public partial class WebUserControl : System.Web.UI.UserControl
{
[TemplateContainer(typeof(MyTemplateContainer))]
[TemplateInstance(TemplateInstance.Single)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public ITemplate ContentTemplate { get; set; }
protected void Page_Init(object sender,EventArgs e)
{
this.myPlaceHolderTag.Controls.Clear();
if (this.ContentTemplate != null)
{
var container = new MyTemplateContainer();
this.ContentTemplate.InstantiateIn(container);
this.myPlaceHolderTag.Controls.Add(container);
}
else
{
this.myPlaceHolderTag.Controls.Add(new LiteralControl("No template defined"));
}
}
}
ASCX <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %> <asp:PlaceHolder runat="server" ID="myPlaceHolderTag" /> 添加模板服务器控件的代码 产量 ASPX <%@ Register Namespace="MyControls" TagPrefix="my" %>
<my:MyServerControl runat="server" ID="myServerControl">
<ContentTemplate>
My Server templated control<br />
<asp:Label Text="My Label" runat="server" />
</ContentTemplate>
</my:MyServerControl>
模板容器 namespace MyControls
{
[ToolboxItem(false)]
public class MyTemplateContainer : Control,INamingContainer { }
}
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 收藏的asp.net文件上传类源码
- ASP.NET AJAX:在页面加载完成后触发UpdatePanel
- asp.net – K运行时使用的.Net完整框架和.Net Core Framewo
- .net – 如何动态清除用户控件中的所有控件?
- asp.net – HTTP错误403.14 – 访问网站时出现禁止错误
- 在ASP.NET 4 ReportViewer中使用对象数据源
- asp.net – 如何使用JwtSecurityTokenHandler和JWKS端点验证
- asp.net-core – 在ASP.NET MVC Core中仍然存在ViewModel概
- asp.net – 如何以编程方式回收.net Web应用程序自己的appp
- 如何更改.Net页面将在其下运行的扩展名?
- .net – DataAnnotations与IDataErrorInfo
- asp.net-mvc – 更新用户声明不起作用.为什么?
- asp.net-mvc – MultiSelect jqgrid MVC3的OnCli
- asp.net – CORS错误 – 请求的资源上没有“Acce
- asp.net-mvc – Moq的意外验证行为
- asp.net-mvc – 如何将NUnit作为ASP.NET MVC的测
- asp.net-mvc – 什么时候应该在asp.net mvc中使用
- ASP.NET MVC – IsAjaxRequest()实际上意味着什么
- asp.net-mvc – 如何在asp.net mvc中模拟缓存对象
- asp.net-mvc – 没有ViewContext的Url表单操作
