如何生成具有我想要的任何属性的 System.Web.UI.HtmlControls.HtmlTextArea?

How can I generate a System.Web.UI.HtmlControls.HtmlTextArea with whatever attributes I want?

我有一个非常独特的情况,我需要在页面上从后面的代码生成一个 <textarea>

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

和控制:

<me:Textarea ... />

问题是,我的特殊情况要求我使用奇怪的属性。我基本上需要它来输出这样的东西:

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

所以我希望能够做到:

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

有没有一种简单的方法可以完全按照我的输入进行渲染?或者我应该使用另一个控件?在渲染阶段从头开始构建它?我得到关于标签格式不正确的错误,所以最终我只是希望它吐出 <textarea> 标签,其内容与输入的完全一样。在标签中包含 C# 因为无关紧要。将举任何例子。

尝试以下操作。还不错。

为您的服务器端控件创建一个 属性,您可以在其中填充您想要的任何文本。我称之为"ExtraStuff"。用私有变量支持它。然后覆盖 Render 以写出您的额外内容作为标记的一部分:

    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

然后,在您的标记中,您可以添加要写出的额外内容,方法是将其添加到您创建的 属性 中。不过,您必须确保其编码正确:

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

渲染后,我认为它会像您想要的那样:

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

或者:

另一种可能更可靠的方法是显式声明这些特殊属性,然后以您的格式写出它们。服务器端控件:

    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

标记:

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

输出是一样的。

所有这些答案都很好,但我想与大家分享我想出的方法,使它尽可能简单。

我刚刚创建了一个控件:

Public Class Wrapper
  Inherits Control
End Class

然后:

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

它和我输入的完全一样。对于那些质疑为什么还要打扰的人,我在另一个使用控件构建器的解析器中,并且 <textarea> 是它的子控件之一,因此需要一个解决方法来仅使用常规 HTML.