Como adicionar um modelo para um UserControl?

Esta pergunta foi feita antes

Web Forms :: Suporte em tempo de design para controle de usuário com modelo personalizado no VS 2008VS 2008 Usando o ITemplate em um UserControl e obtendo um erro de renderização no tempo de designcomo mostrar os controles para controle de usuário da web em tempo de design?UserControl ITemplate Erro de tempo de design de propriedade - Fácil para um professor ...

mas não custa perguntar novamente:

Como adicionar modelos a umUserControl no ASP.net

O que não funcionou até agora

Comece com um novoUserControl5, que chamarei deContoso:

public partial class Contoso: System.Web.UI.UserControl
{
}

Isso nos permitirá usar um novo controle:1

<Contoso>
    Stuff in here
<Contoso>

Criar um públicoContentTemplate propriedade do tipoITemplate:

public partial class Contoso: System.Web.UI.UserControl
{
   public ITemplate ContentTemplate { get; set; }
}

e adicione um número indeterminado de atributos aoContentTemplate propriedade: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; }
}

isso nos permitirá adicionar<ContentTemplate> para o controle em nosso arquivo aspx:1

<Contoso>
   <ContentTemplate>
       Stuff in here
   </ContentTemplate>
</Contoso>

Próximo precisamos realmenteusa aContentTemplate coisas, adicionando-o em algum lugar. Fazemos isso adicionando-o a um dos @ internos do nosso UserContrdiv elementos.

A partir do nosso.aspx arquivo que estava originalmente vazio:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>

nós adicionamos um paidiv que manterá nossaContentTemplate coisa

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>
<div id="ContentDiv" runat="server"></div>

Então nós encher oContentTemplate coisas nesse paidiv durante o controleNiss:

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; }
}

Edita: Indique que sua classe implementaINamingContainer:

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; }
}

OINamingContainer interface @ não possui nenhum membro e é usada apenas para marcar seuUserControl classe como algo.

E terminamos3. Agora podemos usar esse controle em nossa página aspx. Mas primeiro precisamos"registo" na parte superior da nossa página aspx:

<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %>

Onde

Contoso.ascx é o nome doascx ArquivContoso é o nome do elemento que usaremos para fazer referência a esse controle de usuáriouc é um pouco de texto que teremos que colocar na frente deuc:Contoso (eu usouc tão curto para controle de usuário)

Adicione o controle à nossa página:

<uc:Contoso ID="Crackers" runat="server">
    <ContentTemplate>
        Stuff goes here
    </ContentTemplate>
</qwerty:Contoso>

E pronto!4

Edita: Esqueceu-se de adicionar o motivo pelo qual o descrito acima não funciona. Visual Studio mostra o erro:

Erro criando controle - Crackers

Type 'System.Web.UI.UserControl' não possui uma propriedade pública denominada 'ContentTemplate'

O que faz sentido, já queUserControl não possui uma propriedade pública chamadaContentTemplate - então eu mal posso culpar.

,Serie

Esta questão é uma das séries Stackoverflow em andamento, "Modelo de controles de usuário":

Como adicionar um modelo para um UserControl?Como herdar do Control, em vez do UserControl?UserControl possui IsPostBack, mas o Controle nãoUserControl não tem propriedade pública denominada ContentTemplateComo especificar CodeFileBaseClass em web.config?Bonus ReadingComo: Criar controles de usuário ASP.NET com modeloriando um controle de usuário modelo com o ASP.Net 2.0ontroles de usuário modelo no ASP.NET para melhor manutenç Notas de rodapé1 Você nunca pode usar essa sintaxe. Essa é apenas uma forma fácil de ler e entender.2 Ninguém sabe quais atributos adicionar, ou por quê. Adicione mais ou menos atributos a gosto.3 Não realizado. Feito com o UserControl, mas não com o nosso trabalh4 Não realizado; não funciona.5 no site (não é um aplicativo da web, não é um assembly separado)

questionAnswers(1)

yourAnswerToTheQuestion