¿Cómo agregar una plantilla a un control de usuario?

Esta pregunta se ha hecho antes

Web Forms :: Soporte de tiempo de diseño para control de usuario personalizado en VS 2008VS 2008 Usando ITemplate en un UserControl y obteniendo un error de reproducción de tiempo de diseño ¿Cómo mostrar los controles para el control de usuario web en tiempo de diseño?UserControl ITemplate Error de tiempo de diseño de propiedad: fácil para un gurú ...

pero no hace daño volver a preguntar:

¿Cómo agrego plantillas a unaUserControl en ASP.net

Lo que no ha funcionado hasta ahora

Comience con una nuevaUserControl5, que llamaréContoso:

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

Esto nos permitirá usar un nuevo control:1

<Contoso>
    Stuff in here
<Contoso>

Crear un públicoContentTemplate propiedad de tipoITemplate:

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

y agregue un número indeterminado de atributos a laContentTemplate propiedad2

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

esto nos permitirá agregar<ContentTemplate> al control en nuestro archivo aspx:1

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

Next necesitamos realmenteutiliza elContentTemplate cosas, al agregarlo en alguna parte. Hacemos esto agregándolo a uno de los @ @ internos de nuestro UserContrdiv elementos.

Comenzando desde nuestra.aspx archivo que originalmente estaba vacío:

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

agregamos un padrediv que mantendrá nuestroContentTemplate cosas:

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

Luego rellenamos elContentTemplate cosas en ese padrediv durante el controlEn es:

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: Indica que tu clase 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; }
}

LosINamingContainera interfaz @ no tiene ningún miembro y solo se usa para marcar suUserControl clase como algo.

Y hemos terminado3. Ahora podemos usar este control en nuestra página aspx. Pero primero necesitamos"registro" it en la parte superior de nuestra página aspx:

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

Dónde

Contoso.ascx es el nombre de laascx archivContoso es el nombre del elemento que usaremos para hacer referencia a este control de usuariouc es un poco de texto que tendremos que poner delante deuc:Contoso (yo suelouc como abreviatura decontrol de usuari)

Agregue el control a nuestra página:

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

¡Y hemos terminado!4

Edita: Olvidé agregar la razón por la cual lo anterior no funciona. Visual Studio muestra el error:

Error que crea el control - Galletas

Type 'System.Web.UI.UserControl' no tiene una propiedad pública llamada 'ContentTemplate'

Lo que tiene sentido, ya queUserControl no tiene una propiedad pública llamadaContentTemplate - así que casi no puedo culparlo.

,Seri

Esta pregunta es una de la serie actual de Stackoverflow, "Templating controles de usuario":

¿Cómo agregar una plantilla a un control de usuario? ¿Cómo heredar de Control, en lugar de UserControl?UserControl tiene IsPostBack, pero Control noUserControl no tiene una propiedad pública denominada ContentTemplate ¿Cómo especifico CodeFileBaseClass de web.config?Bonus Reading Cómo: Crear controles de usuario ASP.NET con plantillaCreando un control de usuario con plantilla con ASP.Net 2.0ontroles de usuario @Templated en ASP.NET para una mejor mantenibilidad Notas al pie1 Nunca puedes usar esa sintaxis. Esa es solo una forma fácil de leer y entender.2 Nadie sabe qué atributos agregar o por qué. Agregue más o menos atributo al gusto.3 No hecho. Hecho con el UserControl, pero no con nuestro trabajo.4 No hecho; no funciona.5 en el sitio web (no una aplicación web, no en un ensamblado separado)

Respuestas a la pregunta(1)

Su respuesta a la pregunta