2010-08-11 6 views
1

J'ai récemment mis du code <% %> blocs de code dans ma page principale. Remarque: J'ai lu le "correctif" pour soit déplacer les choses sur <head> ou en utilisant <%# %> mais aucun d'entre eux ne fonctionne bien pour mon application.Quelles sont les causes "La collection de contrôles ne peut pas être modifiée car le contrôle contient des blocs de code"?

Maintenant, la chose étrange est que je reçois seulement cette erreur sur une page de la mienne. Toutes les autres pages semblent fonctionner correctement, alors qu'est-ce qui cause cette erreur? Je ne vois rien de particulier à cette page. Il utilise le gestionnaire de script comme le font les autres pages de travail et il n'y a rien d'extraordinaire à propos de cette page. Il y a pas mal de contrôles personnalisés, donc il est plus difficile de chercher ce qui est différent sur cette page.

Alors qu'est-ce qui cause l'exception Controls collection cannot be modified because the control contains code blocks?

+0

Vos contrôles personnalisés contiennent-ils des éléments à l'intérieur de '<% %>', et si oui, ajoutez-vous dynamiquement vos contrôles personnalisés à la page? Vous avez également mentionné le code de déplacement de ''; où sont exactement vos blocs de code problématiques? –

+0

Je ne sais pas. J'ai ajouté un codeblock (littéralement aussi simple que '<%/* codesss * /%>') à la page maître et maintenant cette page ne fonctionne pas. @Cory – Earlz

+0

qu'est-ce que vous essayez de faire dans le 'codeblock <% %>' de cette façon, nous pouvons vous aider avec une meilleure approche –

Répondre

1

Si vous possédez une page ou un contrôle avec <% %> et mettez à jour dynamiquement la collection de contrôles (ajoutez un contrôle à la page qui n'est pas définie dans le fichier .aspx/.ascx), cette erreur se déclenchera. Pour contourner cela, je l'ai utilisé un <ASP:Literal/> pour injecter des données au lieu de <% %>

+0

Mes autres pages le font et n'ont pas de problèmes cependant. – Earlz

+0

Si vos autres pages n'ont pas de contrôles ajoutés dynamiquement, alors ils n'auront pas de problèmes - vous n'aurez peut-être aucun contrôle sur les contrôles dynamiques (en fonction des frameworks/helpers UI que vous utilisez) –

+0

Vous pouvez également utiliser un Contrôle 'PlaceHolder', ou un certain nombre d'autres, d'ailleurs. Si c'est '' UserControl'' qui cause un problème, je finis généralement par les restituer côté serveur et à injecter leur code HTML dans la page, vu que la plupart de mes activités sont basées sur l'interactivité AJAX et autres joyeusetés. –

2

Les choses peuvent mal tourner quand un code tente d'ajouter des contrôles à l'étiquette contenant le bloc de code <% ... %> ou <%= ... %> (dans ce cas, votre tag <head>).

Par exemple, lorsque vous utilisez des thèmes, la classe Page ajoute automatiquement des balises <link> au <head> pour chaque fichier CSS dans le répertoire de votre thème. Mais il pourrait aussi être déclenché en réglant le Page.Title.

Mais il existe de nombreuses autres façons de modifier la balise <head>. Ainsi, sans autre information (telle qu'une pile), il est difficile de donner une réponse définitive.

1

Si des thèmes sont activés, cela peut être le cas.

2

Je suis venu avec quelque chose que je trouve beaucoup plus facile et plus simple - tout en laissant l'étiquette dans l'en-tête où il appartient.

D'abord, démarrez le bloc de code avec <% au lieu de # <% =:

<head id="head1" runat="server"> 
    <title>My Page</title> 
    <link href="css/common.css" rel="stylesheet" type="text/css" /> 
    <script type="text/javascript" src="<%# ResolveUrl("~/javascript/leesUtils.js") %>"></script> 
</head> 

Cela modifie le bloc de code à partir d'un bloc de code Response.Write à une expression de liaison de données. Puisque les expressions de liaison de données <% # ...%> ne sont pas des blocs de code, le CLR ne s'en plaindra pas. Ensuite, dans le code de la page principale, vous souhaitez ajouter ce qui suit:

protected void Page_Load(object sender, EventArgs e) 
    { 
     Page.Header.DataBind();  
    } 

La méthode DataBind évalue tous l'expression de liaison de données (s) dans votre tête au moment du chargement.

+0

Merci, cela m'a sauvé la vie – superjugy