2009-08-19 9 views
0

J'écris un contrôle composite personnalisé ASP.NET (Inherits System.Web.UI.WebControls.CompositeControl).Rien de la propriété TagKey()

Par défaut, ma marque de contrôle est entourée de balises. Je sais que je peux sur piloter la propriété TagKey pour définir le retour comme n'importe quelle balise que je veux de l'énumération System.Web.UI.HtmlTextWriterTag.

Ma question: Puis-je rendre mon contrôle rendu sans .NET en ajoutant un balisage autour de lui?


MISE À JOUR (3/2/2011) Merci Swati pour votre réponse. Je veux montrer comment je résous ma question maintenant. Je pense que je vais intégrer certaines des idées de Swati. Plus précisément, AddAttributestoRender(), mais je me demande si cela est nécessaire car CompositeControl manquera d'une balise de marquage parent pour contenir les attributs.

Lorsque je ne veux pas de balise de balise contenant, alors je remplace une propriété & deux méthodes de CompositeControl.

Protected Overrides ReadOnly Property TagKey() As System.Web.UI.HtmlTextWriterTag 
    Get 
     ' System defaults return as HtmlTextWriterTag.Span 
     Return HtmlTextWriterTag.Unknown 
    End Get 
End Property 

Public Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter) 
    If Me.TagKey <> HtmlTextWriterTag.Unknown Then 
     MyBase.RenderBeginTag(writer) 
    End If 
End Sub 

Public Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter) 
    If Me.TagKey <> HtmlTextWriterTag.Unknown Then 
     MyBase.RenderBeginTag(writer) 
    End If 
End Sub 

Répondre

2

Il est possible de se débarrasser de l'étiquette contenant un CompositeControl, mais son travail contre la façon CompositeControl aime travailler (voir ci-dessous)

La bonne façon, apparemment, de mettre TagKey à ce que la La balise principale de votre contrôle est en fait (une div, une table ou autre).

Ensuite, remplacez AddAttributesToRender() pour définir les attributs que vous souhaitez sur votre balise wrapper.

Les éléments que vous souhaitez inclure dans les balises de retour doivent être rendus en surchargeant la méthode RenderContents().

CompositeControl hérite de WebControl, voir une discussion de l'utilisateur de TagKey et AddAttributesToRender() here.

Quelqu'un sur GeeksWithBlogs écrit sur un problème similaire here

Pour simplement se débarrasser de l'emballage bien, voir ce forum post qui montre un moyen de remplacer le constructeur de contrôle et les méthodes RenderBeginTag et RenderEndTag pour supprimer les balises de retour.

+0

Le point à emporter: son travail contre la façon CompositeControl aime travailler Je dois dire grand MERCI codeulike d'avoir signalé AddAttributesToRender(). J'ai manqué ça. Cette pépite est super utile. Note aux autres écrivains - apprendre de ce poste. La réponse comprenait une aide précieuse et des liens de soutien! MERVEILLEUSEMENT utile – MADCookie

0

Ne pourriez-vous pas surcharger la méthode Render(), en la forçant à rendre uniquement le contenu? Peut-être quelque chose comme ça ferait l'affaire:

public override void Render(HtmlTextWriter writer) 
{ 
    RenderContents(writer); 
} 
1

Faire usage de RenderBeginTag.The « RenderBeginTag » appelle une autre méthode, la méthode « AddAttributesToRender », pour faire face à tous les types de « attributs » liés uniquement les balises d'ouverture . La "TagKey" correspond à la balise HTML par défaut correspondant au contrôle Web. Si nous implémentons nos propres balises dans la méthode "RenderBegintag", nous pouvons simplement oublier le problème "TagKey". Vous pouvez faire quelque chose comme ça ..

Public virtual void RenderBeginTag(HtmlTextWriter Writer) 
{ 
    AddAttributestoRender(writer); 
    HtmlTextWriterTag tagKey = TagKey; 
    If(tagKey != HtmlTextWriterTag.Unknown) 
    Writer.RenderBeginTag(tagKey); 
    Else 
    Writer.RenderBeginTag(this.tagName); 
} 
+0

Très bien dit. J'aime comment Stack Overflow peut apporter de nouvelles vues pour de très anciennes questions.Merci de prendre le temps de partager. – MADCookie

Questions connexes