Этот вопрос задан раньше
- Веб-формы:: Поддержка времени разработки для пользовательского шаблона User Control В VS 2008
- VS 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>
-
Далее нам нужно использовать материал
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 на веб-сайте (а не в веб-приложении, а не в отдельной сборке)