2012-05-07 18 views
6

Tengo una página maestra y todas mis páginas la están heredando. Para formatear, pensé colocar el contenido que difiere de una página a otra en ContentPlaceHolder.¿Cómo se puede agregar programáticamente cosas a contentPlaceHolder?

Ahora, ¿cómo puedo insertar todo en eso? Como planeo llenar el ContentPlaceHolder con material de una base de datos, supongo que tendré que hacerlo programáticamente.

  1. ¿Cómo puedo agregar controles a ContentPlace Holder? He comprobado el otro answers, pero no puedo acceder a él por su ID.

  2. ¿Debo utilizar múltiples ContentPlaceHolders desde el principio? Digamos que quiero poner películas. ¿Debería haber solo una con todas las imágenes y descripciones y calificaciones, o un ContentPlaceHolder para cada cosa?

Estoy abierto a otras soluciones, ya que no tengo experiencia con ASP.

Respuesta

2

Lo que sucede normalmente es

  1. configurar sus páginas principales con el html adecuada y ContentPlaceHolder s
  2. crear páginas basadas fuera de la página principal. Si usa Visual Studio y le dice que cree una página nueva basada en una página maestra existente, agregará las áreas Content.
  3. agrega cosas a las áreas de contenido en la página recién creada.

Si desea agregar controles dinámicamente a la página maestra (o cualquiera), puede agregar controles a cualquier control existente. Si no debe envolverse de ninguna manera, simplemente agregue un Placeholder (es un control asp.net).

+0

Disculpe, eso no soluciona realmente mi problema. Necesito un código para poner programáticamente, digamos, algo de texto, en esa área de contenido, porque no puedo acceder a él desde el código detrás de la página web. Tengo la página default.aspx y ContentPlaceHolder con ID = content1. En default.aspx.cs no puedo "ver" contenido1. –

+0

Ya veo. ¿Hay alguna razón por la que no puedas poner un marcador de posición en el área 'Contenido' de tu página? Ciertamente puede agregar cosas a eso: – JayC

+0

Por ejemplo: 'Label lbl = new Label(); lbl.Text = "algo"; placeHolder.Controls.Add (lbl); ' – JayC

1

me ha gustado esta

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
<asp:Literal ID="jsstuff" runat="server"></asp:Literal> 
</asp:Content> 

Y esto entré en código detrás:

string stuff = @"<script type=""text/javascript""> 
             var searchBox = 0; 
             var currentCountry = ''; 
             </script>"; 
        jsstuff.Text = stuff; 
10

vieja pregunta ... pero me acabo de encontrar con este tema y este era el puesto # 1 que mantuvo subiendo a Google, así que imagino que agregaría mi respuesta ya que los otros no funcionaron en mi caso.

Aquí es cómo lo hice cuando un habitual <asp:Content no quiere trabajar (aunque en condiciones normales de uso, la @JayC respuesta es cómo lo hace):

MasterPage tiene esta ContentPlaceHolder:

<asp:ContentPlaceHolder ID="ScriptsPlace" runat="server"></asp:ContentPlaceHolder> 

Tuvo que agregar dinámicamente JavaScript desde un Control de usuario. Tratando de utilizar el ContentPlaceHolder da directamente este error:

Parser Error Message: Content controls have to be top-level controls in a content page or a nested master page that references a master page.

así que quería añadir el script desde el código subyacente.Aquí es la carga de la página para el archivo .ascx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; 
    if (c != null) 
    { 
     LiteralControl l = new LiteralControl(); 
     l.Text="<script type=\"text/javascript\">$(document).ready(function() {js stuff;});</script>"; 
     c.Controls.Add(l); 
    } 
} 

ACTUALIZACIÓN: Así que resulta que tenía que usar esto en más lugares de lo que esperaba, y terminó usando una forma que era mucho más flexible/legibles . En el control del usuario en sí, simplemente envolví el javascript y cualquier otra cosa que necesitara moverse con un div normal.

<div id="_jsDiv" runat="server"> 
    $(document).ready(function() { 
     //js stuff 
    }); 
    Other server controls or HTML junk 
</div> 

Y a continuación, el código detrás se encuentra que div y, a continuación, pasar a la ContentPlaceHolder.

protected void Page_Load(object sender, EventArgs e) 
{ 
    ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; 
    HtmlGenericCOntrol jsDiv = this.FindControl("_jsDiv") as HtmlGenericControl; 
    if (c != null && jsDiv != null) 
    { 
     c.Controls.Add(jsDiv); 
    } 
} 

en realidad poner este código en un control de usuario personalizado, y sólo tengo mis controles de usuario normales heredan desde el control de usuario personalizado, por lo que una vez que envuelva el javascript/etc con un <div id="_jsDiv" runat="server">, el control de usuario personalizada toma cuidar del resto y no tengo que hacer nada en el código detrás del control del usuario.

+0

Esto funciona brillantemente. Incluso podría extenderse para incluir un parámetro de control para el nombre del marcador de posición. Usé esta solución cuando necesité colocar programáticamente un archivo javascript en una secuencia/posición particular, y no en el encabezado. – secretwep

0

Si el espacio de nombre de la página de contenido y la página maestra no es el mismo, entonces el control de la página de contenido no está accesible en Codebehind en la página de contenido.

Además, verifique los archivos de su diseñador. si el control no aparece en el archivo del diseñador, elimine el archivo y vuelva a crear (proyecto-> convertir a aplicación web)

Cuestiones relacionadas