Контент не допускается между тегами открытия и закрытия для пользовательского контроля

Я хочу создать пользовательский элемент управления MyDiv.ascx. Этот элемент управления отображает тег div и делает еще несколько кодов за такими вещами, как добавление нескольких атрибутов и т.д., Что не вызывает беспокойства. Проблема в том, что я хочу текст между тегами открытия и закрытия пользовательского элемента управления. Например:

Текст идет здесь с некоторыми другими тегами HTML.

Итак, когда вы делаете что-то подобное, я получаю ошибку анализа при запуске веб-сайта. Также VS2008 предупреждает меня, говоря: " Содержимое не допускается между открытием и закрытием тегов для элемента MyDiv".

  • Вопрос 1: Могу ли я сделать что-то вроде этого, т.е. текст/разметка между открытием и закрытие тегов пользовательского элемента управления?

  • Вопрос 2: Если да, то как

Ответ 1

Я считаю, вам просто нужно применить к элементу пару атрибутов:

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

Затем вам может потребоваться переопределить AddedControl - я не уверен.

Положите это так: это то, что работает для одного и только пользовательского элемента управления, который я когда-либо писал:)

Ответ 2

Предлагаемые решения не помогли мне. Я нашел следующие решения: Либо сделайте свой пользовательский контроль унаследованным от Panel, а не только UserControl, или если у вас более одного содержимого, например, в моем случае, сделайте ваши поля содержимого PlaceHolder вместо простого 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 s.

Таким образом я могу использовать свой элемент управления с любым контентом в ASPX:

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

Ответ 3

Я также хотел создать пользовательский элемент управления с помощью "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>

Ответ 4

Я нашел это здесь:

ASP.Net: пользовательский контроль с областью содержимого, это явно возможно, но мне нужны детали

Работает как прелесть, но мне жаль, что я не могу отказать в сообщении о времени разработки, содержимое не допускается между открытием и закрытием тегов, но оно работает во время выполнения.

[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>

Ответ 5

Добавить свойство Text в ваш элемент управления и связать это свойство текста с меткой, выполняемой на сервере, которая будет находиться между открывающим и закрывающим div.

Ответ 6

Возможно, вы захотите быть осторожным, что, если вы поместите серверный элемент управления в область содержимого...

Возможно, вы просто захотите наследовать элемент управления с панели и переопределить любые методы, которые необходимо настроить? Может быть проще или сложнее в зависимости от того, что вам нужно настроить

public class MyDiv : Panel
{

}