c# - La colección de Controles no se puede modificar porque el control contiene bloques de código(es decir,<%…%>)
(7)
Estoy intentando crear metaetiquetas dinámicas en C # pero da el siguiente error:
La colección de Controles no se puede modificar porque el control contiene bloques de código (es decir, <% ...%>)
Este es el código que agregué:
HtmlMeta meta = new HtmlMeta();
meta.Name = "keywords";
meta.Content = "book,paper";
Page.Header.Controls.Add(meta);
Muchas gracias.
Dentro de ContentPlaceholder, coloque el control de marcador de posición. Por ejemplo como este,
<asp:Content ID="header" ContentPlaceHolderID="head" runat="server">
<asp:PlaceHolder ID="metatags" runat="server">
</asp:PlaceHolder>
</asp:Content>
Código detrás:
HtmlMeta hm1 = new HtmlMeta();
hm1.Name = "Description";
hm1.Content = "Content here";
metatags.Controls.Add(hm1);
En caso de que esté utilizando componentes de Telerik y tenga una referencia en su javascript con <% = ....%>, entonces envuelva su etiqueta de script con un RadScriptBlock.
<telerik:RadScriptBlock ID="radSript1" runat="server">
<script type="text/javascript">
//Your javascript
</script>
</telerik>
Saludos Örvar
Es difícil decirlo con seguridad porque no ha incluido muchos detalles, pero creo que lo que está sucediendo es que hay <% ... %>
bloques de código dentro de su Page.Header
(que se refiere a <head runat="server">
- posiblemente en una página maestra). Por lo tanto, cuando intenta agregar un elemento a la colección de controles de ese control, aparece el mensaje de error en el título de esta pregunta.
Si estoy en lo cierto, entonces la solución consiste en envolver una etiqueta <asp:placeholder runat="server">
alrededor del bloque de código <% ... %>
. Esto hace que el código bloquee un elemento secundario del control Marcador de posición, en lugar de ser un elemento secundario directo del control Page.Header
, pero no cambia la salida representada en absoluto. Ahora que el bloque de código no es un elemento secundario directo de Page.Header
, puede agregar elementos a la colección de controles del encabezado sin error.
Nuevamente, hay un bloque de código en algún lugar o no verías este error. Si no está en su página aspx, entonces el primer lugar que buscaría es el archivo al que hace referencia el atributo MasterPageFile
en la parte superior de su aspx.
He tenido el mismo problema que resolví de esta manera:
En lugar de agregar el meta al encabezado de la página actual que causó el mismo error que tenía:
Page.Header.Controls.Add(meta);
Utilicé esto en su lugar:
Master.FindControl("YourHeadContentPlaceHolder").Controls.Add(meta);
Y funciona como un encanto.
Para aquellos que usan Telerik como lo menciona Ovar, asegúrese de envolver su javascript en
<telerik:RadScriptBlock ID="radSript1" runat="server">
<script type="text/javascript">
//Your javascript
</script>
</telerik>
Ya que Telerik no reconoce <% #%> cuando busca un elemento y <% =%> le dará un error si su código javascript no está envuelto.
Realmente no resuelve tu pregunta pero es una alternativa importante.
Si desea agregar un html personalizado al principio de la página (dentro del elemento <body>
), puede usar Page.ClientScript.RegisterClientScriptBlock()
.
Aunque el método se llama "script", pero puede agregar una cadena arbitraria, incluido html.
Verifique las soluciones en "La colección de Controles no se puede modificar porque el control contiene bloques de código"
La solución aceptada en la otra pregunta me funcionó: cambiar las instancias de <%=
a <%#
, lo que convierte el bloque de código de Response.Write
en un bloque de evaluación, que no está restringido por las mismas limitaciones.
Sin embargo, en este caso, como sugiere la solución aceptada aquí , debe agregar los controles a algo que no sea un elemento ContentPlaceHolder de la página maestra, a saber, el control asp:Placeholder
sugerido.