テンプレートのようなユーザーコントロールを開発する必要があります。これは、他のコントロールを含む任意のコンテンツを受け入れます。
WmlCard.ascx
<asp:PlaceHolder ID="phContent" runat="server">
<card id="<%= Me.CardId %>" title="<%= Me.Title %>">
<p>
<%= Me.InnerText %>
</p>
</card>
</asp:PlaceHolder>
これは次のように使用されます:
ListaTelefonica.aspx
<%@ Register TagPrefix="sic" TagName="Card" Src="~/path/to/WmlCard.ascx"%>
<sic:Card ID="BuscaCard" runat="server" CardId="busca" title="Lista Telefônica" Visible="false">
<asp:Literal ID="SomeLiteral" runat="server" Visible="false">Some text<br /></asp:Literal>
<asp:Literal ID="RuntimeFilledLiteral" runat="server" Visible="false" /><br /></asp:Literal>
Any text.
</sic:Card>
Ascxユーザーコントロールがを継承する必要があるのは残念ですSystem.Web.UI.UserControl
。たとえば、私が継承できればSystem.Web.UI.WebControls.WebControl
、それはケーキになります。
私の問題はこれに似ていますが、テキストだけでなく、コントロールはその中の他のコントロールを受け入れる必要があります。
<ParseChildren(False)>
でオーバーライドAddParsedSubObject(Object)
してみましWmlCard
たが、ページの読み込み前にhtmlがレンダリングされるため、解決策にはなりませんRuntimeFilledLiteral.Text
。たとえば、ページのPage_Loadの値を変更しても意味がありません。
私が得た最初のエラー:
パーサーエラーメッセージ:タイプ'ASP.sic_sicphone_usercontrol_wmlcard_ascx'には'Literal'という名前のパブリックプロパティがありません。
追加後<PersistenceMode(PersistenceMode.InnerDefaultProperty), ParseChildren(True, "InnerText")>
:
「sic:Card」の「InnerText」プロパティは子オブジェクトを許可しません。
上記と同じですが、WmlCardのプロパティInnerText
タイプをからString
に変更しますList(Of Object)
:
リテラルコンテンツ(「任意のテキスト」)は、「System.Collections.IList」内では許可されていません。
追加<ParseChildren(False)>
してオーバーライドした後AddParsedSubObject
:
エラーメッセージは表示されませんが、内部コントロールのランタイムプロパティを変更する前に、WmlCardのコンテンツがhtmlにレンダリングされます。
WmlCardを次のSystem.Web.UI.WebControls.PlaceHolder
代わりに継承するように変更した場合System.Web.UI.UserControl
:
'... UserControl.WmlCard'は、クラス'System.Web.UI.UserControl'を拡張しないため、ここでは許可されません。