【发布时间】:2011-03-03 16:36:31
【问题描述】:
我需要开发一个类似模板的用户控件,它可以接受任意内容,包括其他控件。
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,那将是小菜一碟。
我的问题与to this one 类似,但控件应该接受其中的任何其他控件,而不仅仅是文本。
我尝试了<ParseChildren(False)> 并在WmlCard 中覆盖AddParsedSubObject(Object),但这不是解决方案,因为html 是在页面加载之前呈现的,因此在页面的Page_Load 中更改RuntimeFilledLiteral.Text 的值毫无意义,例如。
我遇到的第一个错误:
解析器错误消息:类型“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 '。
【问题讨论】: