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

问题描述 投票:13回答:6

我想构建一个用户控件,假设MyDiv.ascx。该控件呈现div标签,并在诸如添加少量属性等内容之后执行了一些其他代码,这在此无需关注。问题是我想要用户控件的开始和结束标记之间的文本。例如:

文本与其他一些HTML标记一起放在此处。

因此,当执行此类操作时,我在运行网站时收到解析错误。VS2008还警告我说“ 元素的开始和结束标签之间不允许包含内容 MyDiv”。

  • 问题1:我可以在打开之间进行这样的操作吗,即文本/标记和关闭用户控件的标签?

  • 问题2:如果是,如何

c# .net asp.net user-controls
6个回答
14
投票

我相信您只需要对控件应用几个属性:

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

可能然后需要覆盖AddedControl-我不确定。

以这种方式放置-这就是我写过的唯一一个用户控件的工作原理:)


17
投票

建议的解决方案对我不起作用。我发现以下解决方案:或者让您的用户控件继承自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 s。

这样,我可以将控件与ASPX中的任何内容一起使用:

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

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
投票

我发现了:

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>

0
投票

向控件添加一个Text属性,并将此text属性链接到在服务器上运行的标签,该标签将在开始和结束div之间。


0
投票

您可能要小心,如果在内容区域中放置服务器控件,该怎么办...

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

public class MyDiv : Panel
{

}
© www.soinside.com 2019 - 2024. All rights reserved.