2017-09-08 1 views
1

J'ai une situation unique où je dois générer un <textarea> sur la page, à partir du code derrière:Comment puis-je générer un System.Web.UI.HtmlControls.HtmlTextArea avec les attributs que je veux?

Public Class Textarea 
    Inherits System.Web.UI.HtmlControls.HtmlTextArea 
End Class 

Et le contrôle:

<me:Textarea ... /> 

Le problème est, mon cas unique me demande utiliser des attributs étranges. J'ai besoin essentiellement à la sortie quelque chose comme ceci:

<textarea :class="{}" :id="something"> 

Je veux être en mesure de le faire:

<me:Textarea :class="{}" etc. /> 

est-il un moyen simple pour permettre le rendu exactement comme je tape? Ou devrais-je utiliser un autre contrôle? Construire à partir de zéro dans la phase de rendu? Je reçois des erreurs au sujet de l'étiquette n'étant pas bien formé, donc en fin de compte je veux juste qu'il crache l'étiquette <textarea> avec le courage de celui-ci exactement comme tapé. Y compris C# dans les tags, car cela n'a pas d'importance. Prendra n'importe quel exemple.

Répondre

1

Toutes ces réponses sont excellentes, mais je voulais partager avec tout le monde ce que j'ai compris comment faire pour le rendre aussi simple que possible.

Je viens de créer un contrôle:

Public Class Wrapper 
    Inherits Control 
End Class 

Puis:

<me:Wrapper> 
    <textarea anything i want here... ></textarea> 
</me:Wrapper> 

qui vient recrache exactement comme je l'ai tapé. Pour ceux qui s'interrogent sur la raison pour laquelle cela dérange, je suis dans un autre analyseur qui utilise un générateur de contrôles et <textarea> en est l'un des contrôles enfants, il fallait donc une solution de contournement pour simplement utiliser du HTML standard.

+0

Beau travail. C'est vraiment plus simple. – PerpetualStudent

0

Essayez les solutions suivantes. Ce n'est pas si mal.

Pour votre contrôle côté serveur, créez une propriété que vous pouvez remplir avec le texte de votre choix. Je l'ai appelé "ExtraStuff". Soutenez-le avec une variable privée. outrepasser ensuite le rendu d'écrire vos trucs supplémentaires dans le cadre de l'étiquette:

Public Class Textarea 
    Inherits System.Web.UI.HtmlControls.HtmlTextArea 

    Private m_sExtraStuff As String = "" 

    Public Property ExtraStuff As String 
     Get 
      Return m_sExtraStuff 
     End Get 
     Set(value As String) 
      m_sExtraStuff = value 
     End Set 
    End Property 

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
     writer.Write("<textarea ") 
     writer.Write(m_sExtraStuff) 
     writer.Write("></textarea>") 
    End Sub 

End Class 

Ensuite, dans votre balisage, vous pouvez ajouter les choses supplémentaires que vous voulez écrire en ajoutant à la propriété que vous avez créé. Vous devrez vous assurer qu'il est codé correctement si:

<me:Textarea runat="server" ExtraStuff=":class=&quot;{}&quot; :id=&quot;something&quot;"></me:Textarea> 

Lorsque cela rend, je pense que ça va ressembler à vous le voulez:

<textarea :class="{}" :id="something"></textarea> 

Ou:

Une autre approche qui pourrait être plus robuste consiste à déclarer explicitement ces attributs spéciaux, puis les écrire dans votre format. Le contrôle côté serveur:

Public Class Textarea 
    Inherits System.Web.UI.HtmlControls.HtmlTextArea 

    Private m_sSpecialID As String = "" 
    Private m_sSpecialClass As String = "" 

    Public Property SpecialID As String 
     Get 
      Return m_sSpecialID 
     End Get 
     Set(value As String) 
      m_sSpecialID = value 
     End Set 
    End Property 

    Public Property SpecialClass As String 
     Get 
      Return m_sSpecialClass 
     End Get 
     Set(value As String) 
      m_sSpecialClass = value 
     End Set 
    End Property 

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
     writer.Write("<textarea :class=""") 
     writer.Write(m_sSpecialClass) 
     writer.Write(""" :id=""") 
     writer.Write(m_sSpecialID) 
     writer.Write("""></textarea>") 
    End Sub 

End Class 

Le balisage:

<me:Textarea runat="server" SpecialClass="{}" SpecialID="something"></me:Textarea> 

La sortie est le même.