¿Cómo puedo incluir marcas adicionales dentro de una propiedad 'Contenido' interna de un ASP.Net WebControl?

StackOverflow https://stackoverflow.com/questions/2745886

Pregunta

he buscado el sitio y no puedo encontrar una solución para mi problema, así que disculpas si ya ha sido contestada (estoy seguro de que alguien debe haber preguntado esto antes).

He escrito una ventana emergente jQuery que he empaquetada como un WebControl y IScriptControl. El último paso consiste en ser capaz de escribir el marcado dentro de las etiquetas de mi control. He usado el atributo InnerProperty un par de veces, pero sólo para la inclusión de listas de clases inflexible.

Esta es mi propiedad en el WebControl:

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public something??? Content
{
   get
   {
      if (_content == null)
      {
         _content = new something???();
      }
      return _content;
   }
}
private something??? _content;

Aquí está el código HTML de lo que busco:

   <ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px"
      Modal="true" WindowCaption="Test Window" CssClass="window">
      <Content>
         <div style="display:none;">
            <asp:Button runat="server" ID="Button1" OnClick="Button1_Click" />
         </div>
         <%--Etc--%>
         <%--Etc--%>
      </Content>
   </ctr:WebPopup>

Por desgracia no sé qué tipo es de mi propiedad contenido debe ser. Básicamente necesito para replicar UpdatePanel del ContentTemplate.

Editar :? Así que el siguiente permite un contenedor de plantilla que se crea automáticamente, pero no hay controles se presenta, lo que está mal con lo que estoy haciendo

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
    get
    {
        return _content;
    }
    set
    {
        _content = value;
    }
}
private ITemplate _content;

Edit2 : Anulación de los CreateChildControls permite que los controles dentro de la ITemplate que pasarán a ser:

protected override void CreateChildControls()
{
   if (this.Content != null)
   {
      this.Controls.Clear();
      this.Content.InstantiateIn(this);
   }
   base.CreateChildControls();
}

Por desgracia, no puede ahora acceder a los controles dentro de la ITemplate desde el archivo de código subyacente en el archivo. Es decir. si pongo un botón dentro de mi marca como así:

<ctr:WebPopup runat="server" ID="win_StatusFilter">
   <Content>
      <asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" />
   </Content>
</ctr:WebPopup>

a continuación, no puede tener acceso btn_Test del código detrás:

protected void Page_Load(object sender, EventArgs e)
{
   btn_Test.Text = "btn_Test is not present in Intellisense and 
      is not accessible to the page. It does, however, render correctly.";
}

Edit3 : FIJO! Editar 2 es la soluion correcta. Era sólo Visual Estudios 2010 siendo un dolor en las nalgas. Cerrada la aplicación y se volvió a abrir y todos mis controles dentro de la propiedad contenido eran accesibles en la página.

EDIT4 Editar 2 no soluciona el problema. Ya había probado el atributo [TemplateInstance(TemplateInstance.Single)] antes de que nadie lo había mencionado, sin embargo en ese momento yo no pensaba que había hecho una diferencia. Parece Visual Estudios 2010 sólo está siendo raro hoy en día.

Desde Quité la etiqueta y que llevaba trabajando, I asumió el atributo no había hecho una diferencia. Desde que se remonta al código de nuevo los controles han de estar disponibles. La adición de la parte posterior atributo en todo permitido para el trabajo y para los controles sea del lado del servidor accesible. LOCURA . Yo estaré aceptando la respuesta de Brian como se refirió a la solución antes que nadie.

¿Fue útil?

Solución

Contenido pública ITemplate

que luego renderizar a la interfaz de usuario como:

Label label = new Label();
this.Content.InstantiateIn(label);

//Render label

EDIT: Asegúrese de que la plantilla también define

[TemplateInstance(TemplateInstance.Single)]

ya que esto le permite acceder a los controles dentro de la plantilla directamente.

Otros consejos

Se debe tratar de usar esto:

win_StatusFilter.FindControl("btn_Test") // this will be a Control
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null.

De lo contrario, debe definir algunas propiedades para su control, como en este artículo: http://msdn.microsoft.com/ ru-ru / library / 36574bf6% 28v = VS.90% 29.aspx


Actualización: Según las declaraciones en este artículo sobre ContentTemplate propiedad del UpdatePanel:

http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contenttemplate(v=VS.90).aspx

se puede obtener a partir de los controles ContentTemplate a causa de valor TemplateInstanceAttribute (UpdatePanel.ContentTemplate tiene la TemplateInstance.Single).

Por lo que sólo debe utilizar este código:

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content

Más información en:

http: //msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v=VS.90).aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top