用户控制的开始和结束标记之间不允许有内容
我想构建一个用户控件,假定为MyDiv.ascx。 这个控件呈现div标签,并且做一些诸如添加少量属性等东西的代码,这在这里不是问题。 问题是我想要在用户控件的开始和结束标记之间的文本。例如:用户控制的开始和结束标记之间不允许有内容
本文带有一些其他HTML标签。
因此,当做这样的事情时,我会在运行网站时出现解析错误。 另外,VS2008会提醒我“元素 MyDiv的开始和结束标记之间不允许有内容”。
问题1:我可以这样做的用户控件的开 和结束标记之间的这种即文本/标记?
问题2:如果是,如何
我相信,你只需要几个属性适用于控制:
[ParseChildren(false)]
[PersistChildren(true)]
public class MyDiv : UserControl
{
...
您可能则需要重写AddedControl
- 我不知道。
这样说吧 - 那是因为我曾经写过独一无二的用户控制:)
添加一个文本属性到您的控制,并在服务器,这将是打开和关闭的div之间的链接这一文本属性为标签运行。
这就是我不想做......我希望它表现得像正常的标签... – Manish 2009-08-23 17:03:58
你可能要小心,如果你把一个服务器控件内容区域什么工作.. 。
您可能只是想从面板继承控件并覆盖任何需要调整的方法?取决于您需要自定义的内容,可能会更容易或更困难
public class MyDiv : Panel
{
}
我不能这样做我猜... bcoz它已经继承自UserControl类...所以将无法从其他类继承...是他们的任何接口,我可以实现? – Manish 2009-08-23 17:06:13
建议的解决方案对我无效。我发现了以下解决方案: 要么让您的用户控件继承Panel
而不是UserControl
,或者如果您拥有多于一个的内容,请使您的内容字段为PlaceHolder
s而不是简单的Control
s。
添加了[PersistenceMode(PersistenceMode.InnerProperty)]
以避免XHTML验证警告。
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
是PlaceHolder
秒。
这样我可以用我的控制装置与ASPX任何内容:
<local:Drawer ID="ctlDrawer" runat="server">
<BodyContent>
<!--Insert any ASP content here-->
</BodyContent>
<GripContent>
<!--Insert any ASP content here-->
</GripContent>
</local:Drawer>
可能是一个复合控制(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol.aspx)在你的情况下一个很好的解决方案。你说什么玛特? – Manish 2010-10-11 11:19:10
我在答案中添加了更多详细信息,以说明此解决方案的灵活性。当我必须将控件嵌入到具有其资源的程序集中时,才切换到CompositeControls,以便于分发。 – Mart 2010-10-11 17:45:04
我在这里建议的一个补充是在将它们添加到phBodyContent等之前也检查新的PlaceHolder对象。当我指定了一些BodyContent时,它工作正常,但如果没有,则会出错。 – mattkgross 2017-10-09 22:57:43
我也想创建“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>
+1完整语法 – 2011-05-10 17:20:56
,我发现这个在这里:
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>
如果包含有效的语法/代码,则答案更有用。 – 2012-06-10 16:10:52
哇...工作就像一个魅力... 但...可以üPLZ告诉我如何得到该内部的HTML,因为我没有得到这种属性..像** this.InnerHtml或this.Children ** .. ??? – Manish 2009-08-24 06:23:29
您可以使用[ParseChildren(true,“Body”)]和一个名为字体类型为“Body”的属性。这会将InnerHtml的内容放入ParseChildren注释中作为第二个参数命名的任何属性。 – 2010-10-20 22:43:41