Как добавить шаблон в UserControl?

Этот вопрос задавался раньше

Web Forms :: Design Time Поддержка пользовательского шаблона пользовательского управления в VS 2008VS 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>

Далее нам нужно на самом деле Использование 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 на веб-сайте (не в веб-приложении, не в отдельной сборке)

Ответы на вопрос(1)

Ваш ответ на вопрос