Содержание не допускается между открывающим и закрывающим тегами для контроля пользователя - PullRequest
11 голосов
/ 21 августа 2009

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

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

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

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

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

Ответы [ 6 ]

17 голосов
/ 11 октября 2010

Предлагаемые решения не сработали для меня. Я нашел следующие решения: Либо заставьте свой пользовательский элемент управления наследовать от 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>
13 голосов
/ 21 августа 2009

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

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

Вы можете , тогда нужно переопределить AddedControl - я не уверен.

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

4 голосов
/ 25 апреля 2011

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

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

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>
0 голосов
/ 21 августа 2009

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

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

public class MyDiv : Panel
{

}
0 голосов
/ 21 августа 2009

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

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