2010-09-30 12 views
20

Escribo varios controles de servidor ASP.NET y necesito eliminar las etiquetas que envuelven mi control de manera predeterminada. Soy consciente de que puedes cambiar la etiqueta por una etiqueta diferente (como en esta pregunta, How Do I Change the render behavior of my custom control from being a span), pero ¿cómo puedes evitarlo?Prevenir envolver <span> etiquetas para el control de servidor ASP.NET

Heredo de WebControl (también puede heredar de CompositeControl).

normalmente me sale:

<span>Control output</span> 

necesito:

Control output 

estoy preponderantes con RenderContents (salida) y los HtmlTextWriter CreateChildControls() (a través de diversos métodos de control). Mi necesidad inmediata es abordar el problema utilizando el método RenderContents (HtmlTextWriter output).

Respuesta

37

¿Qué tal esto?

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.Write(""); 
    } 

    public override void RenderEndTag(HtmlTextWriter writer) 
    { 
     writer.Write(""); 
    } 
+0

¡Demasiado obvio! Gracias por tu ayuda. –

+2

Solución brillante :) De hecho, utilicé un método vacío para ambos y simplemente coloqué una línea de comentarios explicando por qué están allí. No estoy seguro de si es diferente de la suya, pero parece innecesario escribir una cadena en blanco. – William

+0

Esto me ayudó mucho; tuve que leer muchos "buenos consejos" antes de encontrar la solución perfecta.Si es posible, le daría más de un voto alternativo * g * –

3

Una forma más elegante de hacer esto es mediante el uso de la contrustor de WebControl (Por defecto, se llama con el HtmlTextWriterTag.Span)

public MyWebControl() : base(HtmlTextWriterTag.Div){} 

y reemplazar el método RenderBeginTag añadir atributos personalizados o otras cosas:

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.AddAttribute("class", "SomeClassName"); 
     base.RenderBeginTag(writer); 
    } 
+0

Esto no resuelve el problema. Si bien esto le permitirá cambiar el tramo a un elemento diferente, como el div dado en su ejemplo, no le permite eliminar el elemento externo por completo, según lo solicitado. Puede pasar 'HtmlTextWriterTag.Unknown' o una cadena vacía a la llamada a' base() ', pero mientras eso elimina el nombre del elemento, los corchetes angulares para el elemento se mantienen, por lo que termina con el inválido marcado: '<>'. – Elezar

1

Estaba teniendo el mismo problema. En mi caso yo estaba sustituyendo los métodos:

protected override void OnPreRender(EventArgs e) 
    { /* Insert the control's stylesheet on the page */ } 

y

protected override void RenderContents(HtmlTextWriter output) 
     { /* Control rendering here, <span> tag will show up */ } 

Para evitar esto, simplemente sustituye la anulación RenderContents con lo siguiente:

protected override void Render(HtmlTextWriter output) 
     { /* Control rendering, no <span> tag */ } 

Espero que esto ayude.

+1

Usar Render en lugar de RenderContents funciona para mí. De esta forma, RenderBeginTag/RenderEndTag nunca se llama realmente – Trent

0

No creo que la respuesta aceptada sea completamente necesaria. Podría estar equivocado, pero el render método llama a los tres:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

Por lo que debe ser capaz de simplemente anular prestar y manualmente llamar RenderContents:

protected override void Render(HtmlTextWriter writer) 
{ 
    this.RenderContents(writer); 
} 

¿Alguien? Tal vez me estoy perdiendo algo. Sé que este hilo es viejo, pero me encontré con esto recientemente que lo anterior fue mi solución.

Cuestiones relacionadas