Как добавить шаблон в UserControl?
Этот вопрос задавался раньше
Web Forms :: Design Time Поддержка пользовательского шаблона пользовательского управления в VS 2008VS 2008 Использование ITemplate в UserControl и получение ошибки повторного представления времени разработки Как показать элементы управления для веб-пользователя во время разработки?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>
Далее нам нужно на самом деле Использование theContentTemplate
материал, добавив его куда-нибудь. Мы делаем это, добавляя его в один из внутренних пользовательских контроллеров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>
Затем мы наполняем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; }
}
TheINamingContainer
interface не имеет членов, а используется только для обозначения вашегоUserControl
класс как-то.
И мы закончили3. Теперь мы можем использовать этот элемент управления на нашей странице aspx. Но сначала нам нужно"регистр" это вверху нашей страницы aspx:
<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %>
Где
Contoso.ascx
это имяascx
файContoso
- это имя элемента, который мы будем использовать для ссылки на этот пользовательский элемент управленияuc
- это немного текста, который мы должны поместить передuc:Contoso
(я используюuc
как сокращение от Пользователь-контроль)Добавьте элемент управления на нашу страницу:
<uc:Contoso ID="Crackers" runat="server">
<ContentTemplate>
Stuff goes here
</ContentTemplate>
</qwerty:Contoso>
И мы закончили!4
Редактироват: Забыл добавить причину, по которой вышеперечисленное не работает. Visual Studio показывает ошибку:
Ошибка создания контроля - Взломщики
Тип 'System.Web.UI.UserControl' не имеет открытого свойства с именем 'ContentTemplate'
Что имеет смысл, так какUserControl
не имеет публичного свойства с именемContentTemplate
- так что я вряд ли могу винить в этом.
Этот вопрос один из текущих серий Stackoverflow, "Шаблоны пользовательских элементов управления":
Как добавить шаблон в UserControl? Как наследовать от Control, а не от UserControl?UserControl имеет IsPostBack, но Control не имеетUserControl не имеет открытого свойства с именем ContentTemplate Как мне указать CodeFileBaseClass из web.config? Приятного чтения Как: создавать шаблонные элементы управления ASP.NET Создание шаблонного пользовательского элемента управления с ASP.Net 2.0 Шаблонные элементы управления в ASP.NET для лучшего сопровождения Сноски1 Вы никогда не сможете использовать этот синтаксис. Это просто читаемая и понятная форма.2 Никто не знает, какие атрибуты добавить или почему. Добавьте более или менее атрибут по вкусу.3 Не выполнено. Сделано с UserControl, но не с нашей работой.4 Не выполнено; это не работает.5 на веб-сайте (не в веб-приложении, не в отдельной сборке)