Pregunta

Tengo muchas ocurrencias de este tipo de código repetitivo en mi proyecto ASP.NET.

<div class="inputfield">
  <div class="tl">
    <span class="tr"><!-- --></span>
    <span class="ll"><!-- --></span>
    <div class="lr">
      <div class="cntnt">
        <asp:TextBox .../>
      </div>
    </div>
  </div>
</div>

Como habrás adivinado, todo en ese fragmento es puro repetitivo, excepto el campo de texto más interno.

¿Cuál es la mejor manera de evitar este tipo de repeticiones en ASP.NET? En p. Django, le haría una etiqueta personalizada, como tal:

{% boiler %}
<input ... />
{% endboiler %}

Estaba pensando que tal vez pueda crear un control de usuario, pero todos los tutoriales sobre controles de usuario de ASP.NET que he encontrado son muy simplistas y de cierre automático, es decir, no conocen el contenido de la etiqueta. Necesito algo en la línea de:

<Hello:MyControl>
  <asp:TextBox .../>
</Hello>

Entonces mi pregunta es la siguiente: ¿cuál es la mejor manera de evitar el repetitivo?

¿Fue útil?

Solución

Puede usar una propiedad ITemplate. Por lo tanto, puede inyectar contenido diferente en diferentes situaciones.

[PersistChildren(false), ParseChildren(true, "ContentTemplate")]
public partial class WebUserControl1 : System.Web.UI.UserControl
{

    [System.ComponentModel.Browsable(false), System.Web.UI.PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate ContentTemplate { get; set; }

    protected override void CreateChildControls()
    {
        if (this.ContentTemplate != null)
            this.ContentTemplate.InstantiateIn(this);

        base.CreateChildControls();
    }
}

Otros consejos

Coloque asp: TextBox en su control de usuario, junto con las otras etiquetas html. Proporcione propiedades en su control de usuario que coincidan con las propiedades del cuadro de texto, para que pueda hacer algo como esto:

<Hello:MyControl ID="myControl" runat="server" Width="300px" MaxLength="30" />

y luego las propiedades de ancho y longitud máxima simplemente se transfieren al cuadro de texto interno.

También puede proporcionar acceso al cuadro de texto desde el control de usuario y establecer todas las propiedades en el código subyacente.

Cree una clase como esta:

[PersistChildren(false), ParseChildren(true, "ContentTemplate")]
public class CustomContent:WebControl
{
    [System.ComponentModel.Browsable(false), System.Web.UI.PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public ITemplate ContentTemplate { get; set; }

    private PlaceHolder m_placeHolder;
    protected override void CreateChildControls()
    {
        m_placeHolder = new PlaceHolder();

        if (this.ContentTemplate != null)
            this.ContentTemplate.InstantiateIn(m_placeHolder);

        Controls.Add(m_placeHolder);
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        writer.Write(@"<div class=""inputfield"">
<div class=""tl"">
<span class=""tr""><!-- --></span>
<span class=""ll""><!-- --></span>
<div class=""lr"">
  <div class=""cntnt"">
");
        base.RenderContents(writer);

        writer.Write(@"      </div>
</div>
</div>
</div>
");
    }

}

Esta clase no es un "Control de usuario" es un "Control del servidor". Puede hacer lo mismo con un control de usuario, pero tendrá problemas con el diseñador. Esto funcionará en el diseñador. Y puede poner marcas como esta en su ASPX:

    <uc1:CustomContent runat="server" ID="content">
       <asp:textbox runat="server"></asp:textbox>
    </uc1:CustomContent>

no olvide la declaración de la página de registro en la parte superior de aspx

<%@ Register tagprefix="uc1" Assembly="Assembly where CustomContent is" Namespace="namespace where CustomContent is" %>

Puedes poner lo que quieras dentro de las etiquetas uc1: CustomContent y generará ese html repetitivo a su alrededor. Si tiene curiosidad acerca de cómo funciona ITemplate, hay muchos artículos sobre msdn, etc.

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