55 votes

La collection Controls ne peut pas être modifiée car le contrôle contient des blocs de code (c'est-à-dire <% ... %>).

J'essaie de créer des métabalises dynamiques en c#.

Il donne l'erreur suivante La collection Controls ne peut pas être modifiée car le contrôle contient des blocs de code (c.-à-d. <% ... %> )

Voici le code que j'ai ajouté

HtmlMeta meta = new HtmlMeta();
meta.Name = "keywords";
meta.Content = "book,paper";
Page.Header.Controls.Add(meta);

Merci beaucoup

171voto

Joel Mueller Points 14985

C'est difficile à dire avec certitude car vous n'avez pas donné beaucoup de détails, mais je pense que ce qui se passe, c'est qu'il y a <% ... %> à l'intérieur de votre Page.Header (qui fait référence à <head runat="server"> - éventuellement dans une page maître). Par conséquent, lorsque vous essayez d'ajouter un élément à la collection Controls de ce contrôle, vous obtenez le message d'erreur mentionné dans le titre de cette question.

Si j'ai raison, alors la solution consiste à envelopper un fichier <asp:placeholder runat="server"> autour du <% ... %> bloc de code. Cela fait du bloc de code un enfant du contrôle Placeholder, au lieu d'être un enfant direct du contrôle Placeholder. Page.Header mais cela ne change pas du tout la sortie rendue. Maintenant que le bloc de code n'est pas un enfant direct de Page.Header vous pouvez ajouter des éléments à la collection de contrôles de l'en-tête sans erreur.

Encore une fois, il y a un bloc de code quelque part, sinon vous ne verriez pas cette erreur. Si ce n'est pas dans votre page aspx, alors le premier endroit où je chercherais est le fichier référencé par la balise MasterPageFile en haut de votre aspx.

14voto

Örvar Points 100

Juste au cas où si vous utilisez des composants telerik et que vous avez une référence dans votre javascript avec <%= .... %> alors enveloppez votre balise script avec un RadScriptBlock. J'ai rencontré cette erreur et en incluant un radscriptblock le problème a été résolu.

Salutations Örvar

1voto

drzaus Points 3344

Découvrez les solutions sur "La collection Controls ne peut être modifiée car le contrôle contient des blocs de code"

Le site solution acceptée sur l'autre question a fonctionné pour moi -- changer les instances de <%= à <%# qui convertit le bloc de code de Response.Write à un bloc d'évaluation, qui n'est pas soumis aux mêmes limitations.

Dans ce cas cependant, comme le solution acceptée ici suggère que vous devriez ajouter les contrôles à quelque chose d'autre qu'un élément ContentPlaceHolder de page principale, à savoir l'élément asp:Placeholder contrôle suggéré.

1voto

IRONicMAN Points 454

J'ai eu le même problème que j'ai résolu de cette façon :

Au lieu d'ajouter la méta à l'en-tête de la page actuelle, cela a provoqué la même erreur que vous avez eue :

Page.Header.Controls.Add(meta);

J'ai utilisé ceci à la place :

 Master.FindControl("YourHeadContentPlaceHolder").Controls.Add(meta);

et ça marche comme sur des roulettes.

1voto

hakunamatatakid Points 21

Pour ceux qui utilisent Telerik comme l'a mentionné Ovar, assurez-vous d'envelopper votre javascript dans

 <telerik:RadScriptBlock ID="radSript1" runat="server">
   <script type="text/javascript">
        //Your javascript
   </script>
</telerik>

Puisque Telerik ne reconnaît pas <%# %> lors de la recherche d'un élément et <%= %> vous donnera une erreur si votre code javascript n'est pas enveloppé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X