用户控制的开始和结束标记之间不允许有内容

问题描述:

我想构建一个用户控件,假定为MyDiv.ascx。 这个控件呈现div标签,并且做一些诸如添加少量属性等东西的代码,这在这里不是问题。 问题是我想要在用户控件的开始和结束标记之间的文本。例如:用户控制的开始和结束标记之间不允许有内容

本文带有一些其他HTML标签。

因此,当做这样的事情时,我会在运行网站时出现解析错误。 另外,VS2008会提醒我“元素 MyDiv的开始和结束标记之间不允许有内容”。

  • 问题1:我可以这样做的用户控件的开 和结束标记之间的这种即文本/标记?

  • 问题2:如果是,如何

我相信,你只需要几个属性适用于控制:

[ParseChildren(false)] 
[PersistChildren(true)] 
public class MyDiv : UserControl 
{ 
    ... 

可能则需要重写AddedControl - 我不知道。

这样说吧 - 那是因为我曾经写过独一无二的用户控制:)

+0

哇...工作就像一个魅力... 但...可以üPLZ告诉我如何得到该内部的HTML,因为我没有得到这种属性..像** this.InnerHtml或this.Children ** .. ??? – Manish 2009-08-24 06:23:29

+4

您可以使用[ParseChildren(true,“Body”)]和一个名为字体类型为“Body”的属性。这会将InnerHtml的内容放入ParseChildren注释中作为第二个参数命名的任何属性。 – 2010-10-20 22:43:41

添加一个文本属性到您的控制,并在服务器,这将是打开和关闭的div之间的链接这一文本属性为标签运行。

+0

这就是我不想做......我希望它表现得像正常的标签... – Manish 2009-08-23 17:03:58

你可能要小心,如果你把一个服务器控件内容区域什么工作.. 。

您可能只是想从面板继承控件并覆盖任何需要调整的方法?取决于您需要自定义的内容,可能会更容易或更困难

public class MyDiv : Panel 
{ 

} 
+0

我不能这样做我猜... 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); 
    } 
} 

phBodyContentphGripContentPlaceHolder秒。

这样我可以用我的控制装置与ASPX任何内容:

<local:Drawer ID="ctlDrawer" runat="server"> 
    <BodyContent> 
     <!--Insert any ASP content here--> 
    </BodyContent> 
    <GripContent> 
     <!--Insert any ASP content here--> 
    </GripContent> 
</local:Drawer> 
+0

可能是一个复合控制(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol.aspx)在你的情况下一个很好的解决方案。你说什么玛特? – Manish 2010-10-11 11:19:10

+0

我在答案中添加了更多详细信息,以说明此解决方案的灵活性。当我必须将控件嵌入到具有其资源的程序集中时,才切换到CompositeControls,以便于分发。 – Mart 2010-10-11 17:45:04

+2

我在这里建议的一个补充是在将它们添加到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> 
+0

+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> 
+1

如果包含有效的语法/代码,则答案更有用。 – 2012-06-10 16:10:52