Контент не допускается между тегами открытия и закрытия для пользовательского контроля
Я хочу создать пользовательский элемент управления 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
{
}