Мне нужно разработать шаблонный пользовательский элемент управления, который бы принимал любой произвольный контент, включая другие элементы управления.
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")>
:
Свойство 'InnerText' 'sic: Card' не допускает дочерние объекты.
То же, что и выше, но изменение свойства InnerText
типа WmlCard с 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'.