2010-09-30 6 views
20

Scrivo vari controlli server ASP.NET e ho bisogno di rimuovere i tag che avvolgono il mio controllo per impostazione predefinita. Sono consapevole che puoi modificare il tag in un tag diverso (come in questa domanda, How Do I Change the render behavior of my custom control from being a span) ma come puoi prevenirlo?Impedisci il wrapping dei tag <span> per il controllo server ASP.NET

Sono ereditato da WebControl (può anche ereditare da CompositeControl).

genere ho ottenere:

<span>Control output</span> 

Ho bisogno:

Control output 

sto imperativi RenderContents (uscita HtmlTextWriter) e le CreateChildControls() metodi (attraverso vari controlli). Il mio bisogno immediato è di risolvere il problema usando il metodo RenderContents (output HtmlTextWriter).

risposta

37

Che dire di questo?

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

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

Fin troppo ovvio! Grazie per l'aiuto. –

+2

Soluzione brillante :) In realtà ho utilizzato un metodo vuoto per entrambi e ho appena inserito una riga di commento che spiega perché sono lì. Non sono sicuro che sia diverso dal tuo, ma averlo scritto una stringa vuota sembra inutile. – William

+0

Questo mi ha aiutato molto - ho dovuto leggere un sacco di "buoni consigli", prima di trovare la soluzione perfetta.Ti darebbe più di un upvote se possibile * g * –

3

un modo più elegante per fare questo è quello di utilizzare l'contrustor di WebControl (per impostazione predefinita questo viene chiamato con il HtmlTextWriterTag.Span)

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

e l'override del metodo RenderBeginTag per aggiungere attributi personalizzati o altre cose:

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

Questo non risolve il problema. Mentre questo ti permetterà di cambiare lo span in un altro elemento, come il div dato nel tuo esempio, non ti permetterà di rimuovere completamente l'elemento esterno, come richiesto. Puoi passare in 'HtmlTextWriterTag.Unknown' o una stringa vuota alla chiamata a' base() ', ma mentre ciò rimuove il nome dell'elemento, le parentesi angolari per l'elemento sono ancora conservate, quindi ti ritroverai con l'invalido markup: '<>'. – Elezar

1

Ho riscontrato lo stesso problema. Nel mio caso mi è stato sostituendo i metodi:

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

e

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

Per evitare questo, ho semplicemente sostituito il RenderContents di override con il seguente:

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

Spero che questo aiuti.

+1

L'utilizzo di Render anziché RenderContents funziona per me. In questo modo RenderBeginTag/RenderEndTag non viene mai effettivamente chiamato – Trent

0

Non credo che la risposta accettata sia assolutamente necessaria. Potrei sbagliarmi, ma il render metodo chiama tutti e tre:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

Così si dovrebbe essere in grado di sostituire solo il rendering e manualmente chiamare RenderContents:

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

Chiunque? Forse mi manca qualcosa. So che questo thread è vecchio, ma mi sono imbattuto in questo recentemente che la mia era la soluzione.

Problemi correlati