2009-08-21 27 views
11

Quiero crear un control de usuario suponga MyDiv.ascx. Este control representa la etiqueta div y hace pocos códigos más detrás de cosas como agregar algunos atributos, etc. Esto no es motivo de preocupación. El problema es que quiero texto entre las etiquetas de apertura y cierre del control de usuario. Por ejemplo:No se permite el contenido entre las etiquetas de apertura y cierre para el control de usuario

El texto va aquí con algunas otras etiquetas HTML.

Así que cuando hago algo como esto obtengo un error de análisis al ejecutar el sitio web. También VS2008 me advierte diciendo "No se permite el contenido entre las etiquetas de apertura y cierre para el elemento MyDiv".

  • Pregunta 1: ¿Puedo hacer algo como esto es decir, texto/marcado entre la apertura y etiquetas de cierre de un control de usuario?

  • Pregunta 2: En caso afirmativo, ¿cómo

Respuesta

13

Te creo sólo tiene que aplicar un par de atributos para el control:

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

Usted puede este caso es necesario para anular AddedControl - No estoy seguro.

ponerlo de esta manera - que es lo que funciona para el único control de usuario que he escrito :)

+0

Guau ... eso funcionó como un amuleto ... Pero ... ¿pueden decirme cómo puedo obtener ese html interno ya que no obtengo este tipo de propiedad ... como ** this.InnerHtml or this.Children ** .. ??? – Manish

+4

Puedes usar [ParseChildren (true, "Body")] con una propiedad llamada "Body" de tipo string. Esto colocará el contenido de InnerHtml y lo colocará en cualquier propiedad que hayas nombrado como tu segundo argumento en la anotación ParseChildren. –

0

añadir un alojamiento de texto para su control y vinculado esta propiedad de texto a una carrera de etiqueta en el servidor que estará entre la apertura y el div de cierre.

+0

Eso es lo que no quiero hacer ... yo quiero que se comportan como etiquetas normales ... – Manish

0

Es posible que desee tener cuidado, lo que si se pone un control de servidor en el área de contenido ..

Es posible que desee hacer que un control herede de un panel y anular cualquier método que necesite ajustar? Puede ser más fácil o más difícil según lo que necesite personalizar

public class MyDiv : Panel 
{ 

} 
+0

No puedo hacer esto, supongo ... porque ya está heredando de la clase UserControl ... por lo que no podrá heredar de otra clase ... ¿es su interfaz la que puedo implementar? – Manish

17

Las soluciones sugeridas no me funcionaron. Encontré las siguientes soluciones: Haga que su control de usuario herede de Panel en lugar de solo UserControl, o si tiene más de un contenido como en mi caso, haga que sus campos de contenido sean PlaceHolder s en lugar de simple Control s.

Se ha agregado [PersistenceMode(PersistenceMode.InnerProperty)] para evitar la advertencia de validación 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 y phGripContent siendo PlaceHolder s.

De esta manera puedo usar mi control con cualquier contenido en ASPX:

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

Puede ir para un control compuesto (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol.aspx) una buena solución en su caso. ¿Qué dices Mart? – Manish

+0

Agregué más detalles en mi respuesta para ilustrar la flexibilidad de esta solución. Cambio a CompositeControls cuando tengo que incorporar el control en un ensamblaje con sus recursos para una distribución más fácil. – Mart

+2

Una adición que sugeriría aquí es también anular la verificación de los nuevos objetos PlaceHolder antes de agregarlos a phBodyContent, etc. Me funcionó bien cuando especifiqué BodyContent, pero me equivoqué si no lo hacía. – mattkgross

4

También quería crear un control personalizado con "innerHtml".Esto es lo que terminó con (basado en parte en algunas de las respuestas anteriores/comentarios) ...

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> 

página de prueba:

<%@ register src="~/Controls/div.ascx" tagname="div" tagprefix="uc" %> 
<uc:div ID="div1" runat="server">Test data</uc:div> 
+0

+1 para la sintaxis completa –

2

encontré esta aquí:

ASP.Net: User control with content area, it's clearly possible but I need some details

Funciona como un encanto, pero me gustaría poder suprimir el mensaje de tiempo de diseño, no se permite el contenido entre las etiquetas de apertura y cierre, pero funciona en tiempo de ejecución.

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

El marcado es así:

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

Y luego en el cliente:

<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

Las respuestas son más útiles si contienen sintaxis/código válidos. –

Cuestiones relacionadas