Этот вопрос задан раньше
- Веб-формы:: Поддержка времени разработки для пользовательского шаблона User Control В VS 2008
- VS 2008 Использование ITemplate в UserControl и получение ошибки времени разработки проекта
- как показать элементы управления для пользовательского веб-управления во время разработки?
- 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, добавив его где-нибудь. Мы делаем это, добавляя его в один из внутренних элементов UserControldiv.Начиная с нашего
.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во время управления Init:public partial class Contoso: System.Web.UI.UserControl { protected override void OnInit(EventArgs e) { base.OnInit(e); //If there 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 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как сокращение для пользовательского контроля)
-
-
Добавьте элемент управления на нашу страницу:
<uc:Contoso ID="Crackers" runat="server"> <ContentTemplate> Stuff goes here </ContentTemplate> </qwerty:Contoso>
И мы закончили! 4
Изменить. Забыл добавить причину, по которой выше не работает. Visual Studio показывает ошибку:
Ошибка создания Control - Crackers
Тип '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 на веб-сайте (а не в веб-приложении, а не в отдельной сборке)

