web-dev-qa-db-fra.com

"La collection Controls ne peut pas être modifiée car le contrôle contient des blocs de code"

J'essaie de créer un contrôle utilisateur simple qui est un curseur. Quand j'ajoute un AjaxToolkit SliderExtender au contrôle utilisateur, j'obtiens ceci (* & $ # () @ # error:

    Erreur serveur dans l'application. La collection de contrôles ne peut pas être modifiée car le contrôle contient des blocs de code (c'est-à-dire ``). Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. 
 
 Détails de l'exception: System.Web.HttpException: la collection Controls ne peut pas être modifiée car le contrôle contient des blocs de code. (c'est-à-dire ``). 
 
 Erreur source: 
 
 Une exception non gérée a été générée lors de l'exécution de la demande Web en cours. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous. 
 
 Trace d'empilement: 
 
 [HttpException (0x80004005): Les contrôles la collection ne peut pas être modifiée car le contrôle contient des blocs de code (c'est-à-dire ``).] System.Web.UI.ControlCollection.Add (Enfant de contrôle) +8677431 AjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences (Contrôle) en d:\E\AjaxTk-AjaxControlToolkit\Libération\AjaxControlToolkit\ExtenderBase\ScriptObjectBuilder.cs: 293 AjaxControlToolkit.ExtenderControlBase.OnLoad LoadRecursive () 
 +50 System.Web.UI.Control.LoadRecursive () 
 +141 System.Web.UI.Control.LoadRecursive () 
 +141 System.Web. UI.Control.LoadRecursive () 
 +141 System.Web.UI.Control.LoadRecursive () 
 +141 Sy stem.Web.UI.Control.LoadRecursive () 
 +141 System.Web.UI.Control.LoadRecursive () 
 +141 System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627 
 
 
 Informations sur la version: Microsoft .NET Framework Version: 2.0.50727.3074; Version ASP.NET: 2.0.50727.3074 

J'ai essayé de mettre un espace réservé dans le contrôle utilisateur et d'ajouter la zone de texte et l'extension du curseur à l'espace réservé par programme et j'obtiens toujours l'erreur.

Voici le code simple:

<table cellpadding="0" cellspacing="0" style="width:100%">
    <tbody>
        <tr>
            <td></td>
            <td>
                <asp:Label ID="lblMaxValue" runat="server" Text="Maximum" CssClass="float_right" />
                <asp:Label ID="lblMinValue" runat="server" Text="Minimum" />
            </td>
        </tr>
        <tr>
            <td style="width:60%;">
                <asp:CheckBox ID="chkOn" runat="server" /><asp:Label ID="lblPrefix" runat="server" />:&nbsp;<asp:Label ID="lblSliderValue" runat="server" />&nbsp;<asp:Label ID="lblSuffix" runat="server" />
            </td>
            <td style="text-align:right;width:40%;">                

                    <asp:TextBox ID="txtSlider" runat="server" Text="50" style="display:none;" />
                    <ajaxToolkit:SliderExtender ID="seSlider" runat="server" 
                        BehaviorID="seSlider" 
                        TargetControlID="txtSlider" 
                        BoundControlID="lblSliderValue" 
                        Orientation="Horizontal" 
                        EnableHandleAnimation="true" 
                        Length="200" 
                        Minimum="0" 
                        Maximum="100" 
                        Steps="1" />

            </td>
        </tr>
    </tbody>
</table>

Quel est le problème?

362
Daniel P

Commencez par démarrer 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 d'un bloc de code Response.Write en une expression de liaison de données.
Comme <%# ... %> les expressions de liaison de données ne sont pas des blocs de code, le CLR ne se plaindra pas. Ensuite, dans le code de la page maître, ajoutez les éléments suivants:

protected void Page_Load(object sender, EventArgs e)
{
  Page.Header.DataBind();    
}
485
Jalal El-Shaer

J'ai juste rencontré ce problème aussi mais j'ai trouvé une autre solution.

J'ai trouvé que le fait d'encapsuler les blocs de code avec un asp: PlaceHolder-tag résout le problème.

<asp:PlaceHolder runat="server">
  <meta name="ROBOTS" content="<%= this.ViewData["RobotsMeta"] %>" />
</asp:PlaceHolder>

(Le CMS que j'utilise insère dans la section head à partir d'un code derrière lequel m'a empêché d'ajouter des blocs de contrôle personnalisés contenant diverses informations telles que des méta-balises, etc. C'est donc la seule façon dont cela fonctionne pour moi.)

244
Jonas Stensved

Je peux confirmer que le déplacement du javascript avec les balises <% %> de la tête vers la balise de formulaire corrige cette erreur.

http://italez.wordpress.com/2010/06/22/ajaxcontroltoolkit-calendarextender-e-strana-eccezione/

52
ITalez

Placez le javascript sous une balise div.

<div runat="server"> //div tag must have runat server
  //Your Jave script code goes here....
</div>

Ça va marcher !!

31
Anup

vous pouvez utiliser les mêmes fonctionnalités si vous utilisez le gestionnaire de script dans votre page. vous devez simplement enregistrer le script comme celui-ci

<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true"   EnablePageMethods="true">  
<Scripts>
      <asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" />
</Scripts>
</asp:ScriptManager>
8
Mohan Prajapati

J'ai eu le même problème dans le contrôle de l'utilisateur. Ma page qui hébergeait le contrôle avait des commentaires dans la balise head, j'ai supprimé ces commentaires, tout a fonctionné par la suite. Certains messages suggèrent également de retirer les scripts de la tête et de les placer dans le corps.

5
Shafeeq

Dans mon cas, j'ai remplacé <%= %> par <%# %>, et cela a fonctionné!

4
Iori-kyo

J'ai essayé d'utiliser <%# %> sans succès. Ensuite, j'ai changé Page.Header.DataBind(); dans mon code de retard en this.Header.DataBind(); et cela a bien fonctionné.

4
Nick

Conservez le code de script Java à l'intérieur de la balise body

<body> 
   <script type="text/javascript">
   </script>
</body>
2
Vikash pathak

La technique de liaison de données "<% #" ne fonctionnera pas directement à l'intérieur des balises <link> dans la balise <head>:

<head runat="server">

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=<%# My.Constants.CSS_VERSION %>" />

</head>

Le code ci-dessus sera évalué à

<head>

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=&lt;%# My.Constants.CSS_VERSION %>" />

</head>

Au lieu de cela, vous devriez procéder comme suit (notez les deux guillemets à l'intérieur):

<head runat="server">

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=<%# "" + My.Constants.CSS_VERSION %>" />

</head>

Et vous obtiendrez le résultat souhaité:

<head>

  <link rel="stylesheet" type="text/css" href="css/style.css?v=1.5" />

</head>
2
perryv

J'ai eu ce problème, mais pas via l'en-tête. Mon espace réservé était dans le corps. J'ai donc remplacé tous les <%= par <%# et

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

et cela a fonctionné.

2
bcr

Une autre solution consiste à faire en sorte qu'une autre page .aspx joue le rôle de page vers laquelle vous souhaitez créer un lien.

Voici à quoi ressemble l'en-tête de la page principale:

<head runat="server">
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
    <link href="CSS/AccordionStyles.aspx" rel="stylesheet" type="text/css" />
</head>

Le formulaire .aspx référencé contient votre contenu:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AccordionStyles.aspx.cs" Inherits="IntranetConnectCMS.CSS.AccordionStyles" %>
.AccordionHeader
{
    cursor: pointer;
    background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneHeaderClosed.png") %>);
    background-repeat: no-repeat;
}

.AccordionHeaderSelected
{
    cursor: pointer;
    background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneHeaderOpen.png") %>);
    background-repeat: no-repeat;
}
.AccordionContent
{
    background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneContent.png") %>);
    background-repeat: no-repeat;
}

Enfin, vous avez besoin de la page .aspx pour indiquer au navigateur que vous envoyez du contenu CSS:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "text/css";
}
1
Hugo

J'ai eu le même problème avec des circonstances différentes.
J'avais un élément simple à l'intérieur de la balise body.
La solution était:

<asp:PlaceHolder ID="container" runat="server">
    <a id="child" href="<%# variable %>">Change me</a>
</asp:PlaceHolder>
protected new void Page_Load(object sender, EventArgs e)
{    
    Page.Form.DataBind(); // I neded to Call DataBind on Form not on Header
    container.InnerHtml = "Simple text";
}
1
Peter

J'ai eu le même problème avec mon système, j'ai supprimé le code JavaScript de la page et le mets au corps juste avant de fermer la balise body

1
Jesse Mwangi

J'ai également fait face au même problème. J'ai trouvé les solutions comme suit.

Solution 1: J'ai gardé ma balise script dans le corps.

<body>
   <form> . . . .  </form>
    <script type="text/javascript" src="<%= My.Working.Common.Util.GetSiteLocation()%>Scripts/Common.js"></script> </body>

Maintenant, les conflits concernant les tags seront résolus.

Solution 2:

Nous pouvons également résoudre cette solution comme remplacez le bloc de code par <% # au lieu de <% = Mais le problème est qu’il donnera seulement chemin relatif. Si vous voulez vraiment chemin absol cela ne fonctionnera pas.

La solution 1 fonctionne pour moi. Suivant est votre choix.

1
Mihir

J'ai résolu une erreur semblable à celle-ci en plaçant le <script> à l'intérieur d'un contentplaceholder à l'intérieur du <head> au lieu de placer le <script> à l'extérieur dudit contentplaceholder à l'intérieur du <head>

1
Erickson Domingo

J'ai eu le même problème, mais cela n'avait rien à voir avec JavaScript. Considérons ce code:

<input id="hdnTest" type="hidden" value='<%= hdnValue %>' />
<asp:PlaceHolder ID="phWrapper" runat="server"></asp:PlaceHolder>
<asp:PlaceHolder ID="phContent" runat="server" Visible="false">
    <b>test content</b>
</asp:PlaceHolder>

Dans cette situation, vous obtiendrez la même erreur même si PlaceHolders n'a pas de bloc de code nuisible, cela se produit en raison du contrôle non serveur, hdnTest utilise des blocs de code.

Ajoutez simplement runat = server au hdnTest et le problème est résolu.

1
desperate man

Dans mon cas, j'ai eu cette erreur parce que j'avais mal paramétré InnerText sur une div avec du HTML à l'intérieur.

Exemple:

SuccessMessagesContainer.InnerText = "";

   <div class="SuccessMessages ui-state-success" style="height: 25px; display: none;" id="SuccessMessagesContainer" runat="server">
      <table>
         <tr>
            <td style="width: 80px; vertical-align: middle; height: 18px; text-align: center;">
               <img src="<%=Image_success_icn %>" style="margin: 0 auto; height: 18px;
                  width: 18px;" />
            </td>
            <td id="SuccessMessage" style="vertical-align: middle;" class="SuccessMessage" runat="server" >
            </td>
         </tr>
      </table>
   </div>
0
live-love

Supprimez la partie comportant des balises de serveur et placez-la ailleurs si vous souhaitez ajouter des contrôles dynamiques à partir du code situé derrière

J'ai supprimé mon code JavaScript de la section de tête de la page et l'a ajouté au corps de la page et je l'ai fait fonctionner

0
victor

Essayez d’écrire votre code de script Java en dehors de la balise head, cela fonctionnera certainement. Il est résolu lorsque je copie-colle mon code de script Java au bas de la page. Dans la version précédente, elle est placée dans la balise HEAD juste avant de fermer la balise de formulaire.

    </div>
        <script>
                    function validate() {
                        try {

                        var username = document.getElementById("<%=txtUserName.ClientID%>").value;
                        var password = document.getElementById("<%=txtPWD.ClientID%>").value;

                            if (username == "" && password == "")
                                alert("Enter Username and Passowrd");
                            else {
                                if (username == "")
                                    alert("Enter Username");
                                else if (password == "")
                                    alert("Enter Password");
                            }

                        }

                    catch (err) {
                    }
                }
                </script>
</form>
0
Miank

Dans certains cas, ResolveUrl et ResolveClientUrl fonctionnent, mais pas toujours, en particulier dans le cas de fichiers de script js. Qu'est-ce qui se passe est que cela fonctionne pour certaines pages, mais lorsque vous naviguez vers d'autres pages, cela pourrait ne pas fonctionner en raison du chemin relatif de cette page particulière.

Donc, finalement, ma suggestion est toujours de procéder à une nouvelle vérification complète des pages de votre site pour savoir si toutes vos références javascript sont correctes ou non. Ouvrez votre site dans Google Chrome -> cliquez avec le bouton droit de la souris sur la page -> cliquez sur afficher la page source -> le code HTML apparaît -> maintenant cliquez sur vos liens hypertexte JS; s'il fonctionne correctement, le fichier js doit être ouvert dans une autre fenêtre du navigateur, sinon il ne s'ouvrira pas.

0
mdhameed