我想构建一个用户控件,假设MyDiv.ascx。 这个控件呈现div标签,并在诸如添加少量属性之类的东西之后做更多代码,这在这里不是问题。 问题是我希望用户控件的开始和结束标记之间的文本。例如:
文本与其他一些HTML标签一起使用。
所以当做这样的事情时,我在运行网站时遇到了解析错误。 此外,VS2008通过说“元素的开始和结束标签之间不允许内容 MyDiv”来警告我。
问题1:我可以做这样的事情,即打开之间的文本/标记 并关闭用户控件的标签?
问题2:如果是,
答案 0 :(得分:17)
建议的解决方案对我不起作用。我找到了以下解决方案:
要么让您的用户控件继承自Panel
而不仅仅是UserControl
,或者如果您有多个内容(例如我的情况),请将您的内容字段设为PlaceHolder
而不是简单{{ 1}} S上。
添加Control
以避免XHTML验证警告。
[PersistenceMode(PersistenceMode.InnerProperty)]
public partial class DrawerControl : UserControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public PlaceHolder BodyContent { get; set; }
[PersistenceMode(PersistenceMode.InnerProperty)]
public PlaceHolder GripContent { get; set; }
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
phBodyContent.Controls.Add(BodyContent);
phGripContent.Controls.Add(GripContent);
}
}
和phBodyContent
为phGripContent
s。
这样我可以将我的控件用于ASPX中的任何内容:
PlaceHolder
答案 1 :(得分:13)
我相信你只需要在控件中应用几个属性:
[ParseChildren(false)]
[PersistChildren(true)]
public class MyDiv : UserControl
{
...
你可能然后需要覆盖AddedControl
- 我不确定。
这样说 - 这就是我曾经写过的唯一用户控件的作用:)
答案 2 :(得分:4)
我还想用“innerHtml”创建一个自定义控件。这就是我最终得到的结果(部分基于一些早期的答案/评论)......
div.ascx.cs:
[ParseChildren(true, "Text")] //Store inner content in Text property
public partial class div : System.Web.UI.UserControl
{
public string Text { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
litText.Text = Text; //Render it however you want
}
}
div.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="div.ascx.cs" Inherits="TestApp.Controls.div" %>
<div>
<asp:Literal ID="litText" runat="server" />
</div>
测试页面:
<%@ register src="~/Controls/div.ascx" tagname="div" tagprefix="uc" %>
<uc:div ID="div1" runat="server">Test data</uc:div>
答案 3 :(得分:2)
我在这里找到了这个:
ASP.Net: User control with content area, it's clearly possible but I need some details
像魅力一样工作,但我希望能压抑设计时间信息,开关标签之间不允许内容,但它在运行时有效。
[ParseChildren(true, "Content")]
[PersistChildren(false)]
public partial class CollapsiblePanelControl : UserControl
{
private Control content;
// add the content
this.MainContent.Controls.Add(content);
// if this is not a post back
if (!this.IsPostBack)
{
// set to true;
this.Expanded = true;
}
}
标记是这样的:
<asp:Panel ID="CollapsiblePanelMainPanel" runat="server" CssClass="collapsiblepanel">
<asp:Panel ID="CollapsibleHeaderPanel" runat="server" CssClass="collapsibleheaderpanel">
<asp:ImageButton ID="CollapseButton" ImageUrl="~/Images/BlueArrowDown.png" runat="server" OnClick="ExpandButton_Click" CssClass="expandbutton" />
<asp:Label ID="CollapsiblePanelHeaderLabel" runat="server" Text="Collapsed" CssClass="collapsiblelabel"></asp:Label>
</asp:Panel>
<asp:Panel ID="MainContent" runat="server">
</asp:Panel>
</asp:Panel>
然后在客户端:
<dc:CollapsiblePanelControl ID="CheckOnMePanel" runat="server" CssClass="checkonmepanel" EnableViewState="true"
CollapsedHeight="20px" ExpandedHeight="300px" Expanded="true" HeaderText="Check On Me Email Service" >
<Content>
...[Your Content Goes Here]
</Content>
</dc:CollapsiblePanelControl>
答案 4 :(得分:0)
向控件添加Text属性,并将此text属性链接到服务器上运行的标签,该标签位于开始和结束div之间。
答案 5 :(得分:0)
您可能需要小心,如果您将服务器控件放在内容区域中该怎么办...
您可能只想让控件从面板继承并覆盖您需要调整的任何方法?可能更容易或更难,取决于您需要自定义
public class MyDiv : Panel
{
}