2010-09-30 25 views
20

J'écris divers contrôles ASP.NET Server et je dois supprimer les balises qui enveloppent mon contrôle par défaut. Je suis conscient que vous pouvez changer l'étiquette à un autre tag (comme dans cette question, How Do I Change the render behavior of my custom control from being a span) mais comment pouvez-vous l'empêcher?Empêcher l'encapsulation <span> balises pour le contrôle du serveur ASP.NET

Je hérite de WebControl (peut également hériter de CompositeControl).

je reçois habituellement:

<span>Control output</span> 

J'ai besoin:

Control output 

Je PRÉPONDÉRANTS RenderContents (sortie HtmlTextWriter) et les méthodes CreateChildControls() (à travers différents contrôles). Mon besoin immédiat est de résoudre le problème en utilisant la méthode RenderContents (sortie HtmlTextWriter).

Répondre

37

Que pensez-vous de cela?

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

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

Bien trop évident! Merci de votre aide. –

+2

Solution brillante :) En fait, j'ai utilisé une méthode vide pour les deux et juste mettre une ligne de commentaire expliquant pourquoi ils sont là. Je ne sais pas si c'est différent de la vôtre, mais l'écrire une chaîne vide semble inutile. – William

+0

Cela m'a beaucoup aidé - j'ai dû lire beaucoup de «bons conseils», avant que je trouve votre solution parfaite.Vous donnerait plus d'un upvote si possible * g * –

3

Une plus élégante façon de le faire est en utilisant le contrustor de WebControl (Par défaut, ce qu'on appelle le HtmlTextWriterTag.Span)

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

et remplacer la méthode RenderBeginTag pour ajouter des attributs personnalisés ou autre chose:

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

Cela ne résout pas le problème. Bien que cela vous permette de changer la durée d'un élément différent, comme la div donnée dans votre exemple, cela ne vous permet pas de retirer complètement l'élément externe, comme demandé. Vous pouvez transmettre 'HtmlTextWriterTag.Unknown' ou une chaîne vide à l'appel de' base() ', mais tant que cela supprime le nom de l'élément, les crochets de l'élément sont toujours conservés, de sorte que vous vous retrouvez avec l'invalide balisage: '<>'. – Elezar

1

Je rencontrais le même problème. Dans mon cas, je PRÉPONDÉRANTS les méthodes:

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

et

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

Pour éviter cela, je simplement remplacé la RenderContents override ce qui suit:

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

Hope this helps.

+1

Utiliser Render au lieu de RenderContents fonctionne pour moi. De cette façon, le RenderBeginTag/RenderEndTag n'est jamais appelé – Trent

0

Je ne pense pas que la réponse acceptée soit entièrement nécessaire. Je peux me tromper, mais la méthode render appelle tous les trois:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

Donc, vous devriez être en mesure de simplement remplacer le rendu et appeler manuellement RenderContents:

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

Quelqu'un? Peut-être qu'il me manque quelque chose. Je sais que ce fil est vieux mais je me suis heurté à cela récemment que ce qui précède était ma solution.