2008-10-14 6 views
0

Salutations!Suppression de l'attribut de classe CSS d'une balise dans un contrôle de serveur personnalisé

J'ai créé une classe de bouton personnalisé pour rendre les éléments suivants:

<span class="btnOrange"> 
    <input type="submit" id="ctl00_MainContent_m_GoBack" value="Back" name="ctl00$MainContent$m_GoBack"/> 
</span> 

Cependant, il rend comme celui-ci à la place (notez l'attribut étrangère « classe » dans la balise INPUT):

<span class="btnOrange"> 
    <input type="submit" class="btnOrange" id="ctl00_MainContent_m_GoBack" value="Back" name="ctl00$MainContent$m_GoBack"/> 
</span> 

Ma classe de bouton personnalisé ressemble à ceci:

[ToolboxData(@"<{0}:MyButton runat=server></{0}:MyButton>")] 
public class MyButton : Button 
{ 
    public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass); 
     writer.RenderBeginTag("span"); 
     base.RenderBeginTag(writer); 
    } 

    public override void RenderEndTag(HtmlTextWriter writer) 
    { 
     writer.RenderEndTag(); 
     base.RenderEndTag(writer); 
    } 
} 

comme je ne dois définir les clas s attribut pour la balise SPAN, est-il possible de ne pas inclure ou "vide" l'attribut de classe pour le tag INPUT?

Répondre

1

Vous pouvez le faire:

private string _heldCssClass = null; 
public override void RenderBeginTag(HtmlTextWriter writer) 
{ 
    writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass); 
    writer.RenderBeginTag("span"); 
    _heldCssClass = this.CssClass; 
    this.CssClass = String.Empty; 
    base.RenderBeginTag(writer); 
} 

public override void RenderEndTag(HtmlTextWriter writer) 
{ 
    writer.RenderEndTag(); 
    base.RenderEndTag(writer); 
    this.CssClass = _heldCssClass; 
} 

La raison pour laquelle je conserve la propriété CssClass dans une variable privée entre les invocations de méthode est d'éviter si les effets secondaires de se produire pendant le rendu. Cela peut être sans importance dans votre code particulier ("la propriété CssClass est-elle vraiment importante après le rendu?") Mais il est toujours bon d'empêcher ou de réduire l'impact des effets secondaires tels que ce que le code ci-dessus montre en supprimant la propriété.

0

Pourquoi ne pas supprimer l'attribut class de l'objet writer après avoir rendu le tag de début span? Je ne connais pas ASP pour que je puisse me tromper.

+0

Malheureusement, la L'objet writer n'a pas de méthode "RemoveAttribute" ou similaire. Et l'appel de writer.AddAttribute (HtmlTextWriterAttribute.Class, "") crée en réalité deux attributs CLASS dans la balise INPUT; un avec "btnOrange" comme valeur et l'autre avec une valeur vide. – Bullines

0

Au lieu d'invoquer la base RenderBegin/méthodes de RenderEnd, qui s'invoquera AddAttributesToRender (ajoutant ainsi l'attribut de classe), juste rendre l'entrée taguez comme vous faites avec la durée ....

Questions connexes