2008-11-05 6 views
4

Je travaille sur une bibliothèque de contrôles Facebook FBML et voudrais créer mes contrôles FBML un peu comme la bibliothèque ASP.NET WebControls. J'ai une classe de base qui gère le rendu par défaut; voici ma méthode render:Render Auto-fermeture Tag dans le contrôle personnalisé ASP.NET dérivé de contrôle


     protected override void Render(HtmlTextWriter writer) 
     { 
      AddAttributesToRender(writer); 

      if (UseXfbmlSemantics) 
      { 
       writer.RenderBeginTag(ElementName); 
       writer.EndRender(); 
       writer.RenderEndTag(); 
      } 
      else 
      { 
       writer.RenderBeginTag(ElementName); 
       writer.RenderEndTag(); 
      } 
     } 

Ce que je voudrais est pour le rendu à modifier en fonction de UseXfbmlSemantics - s'il est vrai, il doit rendre, par exemple:

<fb:name uid="10300399458"></fb:name>

Quand il est faux, il devrait rendre avec une étiquette de fermeture automatique:

<fb:name uid="10300399458" />

je peux obtenir le « vrai » condition de travailler presque correctement, mais la balise de fermeture auto-semble être incompatible avec l'ensemble Render- de métho ds. Malheureusement, si tel est le cas, cela signifie également que le modèle AddAttributesToRender ne fonctionnerait pas non plus. Ce qu'il est en fait la production est la suivante:


     <fb:name uid="10300399458"> 

     </fb:name> 

Comment puis-je obtenir HtmlTextWriter (ou qui HtmlTextWriter dois-je utiliser) pour faire rendre une balise de fermeture auto-? Ou, à tout le moins, comment puis-je faire en sorte qu'il ne restitue pas cet espace intermédiaire (de sorte que les balises d'ouverture et de fermeture soient immédiatement à côté les unes des autres)?

Répondre

6

Cela devrait vous aider - il va afficher <fb:name uid="00101010101"/>. Vous pouvez également remplacer le RenderBeginTag, RenderContents, RenderEndTag. En fonction de ce que vous faites, il se peut qu'il y ait d'autres choses dans RenderControl dont vous avez besoin. Vous pouvez aussi utiliser un ControlAdapter, cela peut vous donner une meilleure séparation des fonctionnalités de contrôle VS control html writing.

public class FbName:System.Web.UI.WebControls.WebControl 
{ 

    protected override string TagName 
    { 
     get 
     { 
      return "fb:name"; 
     } 
    } 

    public override void RenderControl(HtmlTextWriter writer) 
    { 
     RenderBeginTag(writer);// render only the begin tag. 
     //base.RenderContents(writer); 
     //base.RenderEndTag(writer); 
    } 

    public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.Write("<" + this.TagName); 
     writer.WriteAttribute("uid", "00101010101"); 
     writer.Write("/>"); 

    } 
} 

-Jason

3

Je recommande d'utiliser des constantes de HtmlTextWriter:

protected override void Render(HtmlTextWriter writer) 
    { 
     AddAttributesToRender(writer); 
     writer.Write(HtmlTextWriter.TagLeftChar); // '<' 
     writer.Write(this.TagName); 
     writer.Write(HtmlTextWriter.SpaceChar); // ' ' 
     writer.WriteAttribute("uid", "00101010101"); 
     writer.Write(HtmlTextWriter.SpaceChar); // ' ' 
     writer.Write(HtmlTextWriter.SelfClosingTagEnd); // "/>" 
    } 
+1

Pourquoi? Ce n'est pas plus compact que mon exemple de code, et il ne répond pas vraiment à la question que j'ai posée, soit. – Rob

7

Puisque c'est la partie supérieure la question SO qui apparaît lors de la recherche "tag fermeture automatique HtmlTextWriter", cette est pour toute personne venant ici qui veut savoir comment le faire:

writer.WriteBeginTag("tag"); 
writer.WriteAttribute("attribute", "attribute value"); 
// ... add other attributes here ... 
writer.Write(HtmlTextWriter.SelfClosingTagEnd); 
-1

si vous utilisez Visual studio go par ces étapes:

Outils ---> Options ---> Editeur de texte ---> HTML ----> Mise en forme ---> supprimer insertion automatique balise fermante

Questions connexes