"Die Controls-Auflistung kann nicht geändert werden, da das Steuerelement Codeblöcke enthält."


370

Ich versuche, ein einfaches Benutzersteuerelement zu erstellen, das ein Schieberegler ist. Wenn ich dem Benutzersteuerelement einen AjaxToolkit SliderExtender hinzufüge, wird folgender Fehler angezeigt (* & $ # () @ #:

Server Error in '/' Application. The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`). Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`).

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[HttpException (0x80004005): The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`).]    System.Web.UI.ControlCollection.Add(Control child) +8677431    AjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences(Control control) in d:\E\AjaxTk-AjaxControlToolkit\Release\AjaxControlToolkit\ExtenderBase\ScriptObjectBuilder.cs:293 AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs e) in d:\E\AjaxTk-AjaxControlToolkit\Release\AjaxControlToolkit\ExtenderBase\ExtenderControlBase.cs:306 System.Web.UI.Control.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    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


Version Information: Microsoft .NET Framework Version:2.0.50727.3074; ASP.NET Version:2.0.50727.3074

Ich habe versucht, einen Platzhalter in das Benutzersteuerelement einzufügen und das Textfeld und den Schieberegler-Extender programmgesteuert zum Platzhalter hinzuzufügen, und es wird immer noch der Fehler angezeigt.

Hier ist der einfache Code:

<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>

Was ist das Problem?


11
Was diesen Fehler für mich verursachte, war die Verwendung von <% = Resolve (); %> Funktion innerhalb der Tags <script> und <link>. Ich habe das endlich behoben. Anstatt den fehlerhaften Code im Head-Tag zu entfernen, der normalerweise diesen Fehler verursacht. Fügen Sie einfach den gesamten fehlerhaften Code in ein <asp: ContentPlaceHolder> </ asp: ContentPlaceHolder> -Tag ein.
Daniel P

stackoverflow.com/questions/4995274/… Enthält eine längere Erklärung für den @Daniel PVorschlag.
lko

Antworten:


498

Starten Sie zuerst den Codeblock mit <% # anstelle von <% =:

<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>

Dadurch wird der Codeblock von einem Response.Write-Codeblock in einen Datenbindungsausdruck geändert.
Da <%# ... %>Datenbindungsausdrücke keine Codeblöcke sind, wird sich die CLR nicht beschweren. Dann würden Sie im Code für die Masterseite Folgendes hinzufügen:

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

Ich erhalte diesen Fehler nicht, verwende aber die Notation =. Allerdings: Ich habe gesehen, dass mein Code mit dem oben beschriebenen Problem fehlgeschlagen ist. Was kann das verursachen (warum funktioniert es bei mir in Ordnung)?
Doekman

3
Nach dem Wechsel zu ASP.NET 4 schien dieses Problem zu auftreten. Ist es auf das neue Framework isoliert?
Corgalore

3
Es ist behoben, wenn ich meinen Java Script-Code kopiere und am Ende der Seite einfüge. In der vorherigen ist es in HEAD-Tag platziert.
Miank

1
Dies ist so ein bizarrer Fehler mit .NET. Warum #statt =. Ich werde das nie verstehen, mache es schon seit Jahren, aber ich wünschte ich wüsste WARUM!
Mark Pieszak - Trilon.io

1
Helden ohne Umhänge, wenn sie existieren!
Julián

253

Ich bin auch auf dieses Problem gestoßen, habe aber eine andere Lösung gefunden.

Ich fand, dass das Umschließen der Codeblöcke mit einem asp: PlaceHolder-Tag das Problem löst.

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

(Das von mir verwendete CMS wird aus einem Code in den Kopfabschnitt eingefügt, der mich daran gehindert hat, benutzerdefinierte Steuerblöcke mit verschiedenen Informationen wie Meta-Tags usw. hinzuzufügen. Dies ist also die einzige Möglichkeit, wie dies für mich funktioniert.)


11
Genial. Als früherer Benutzer von Telerik-Steuerelementen habe ich ihren "RadCodeBlock" oft für den gleichen Zweck verwendet, war aber immer verärgert darüber, dass ich nichts anderes wusste (oder wie andere erwähnt haben, den Code in einen zu verschieben) Tag für die serverseitige Ausführung). Ich hätte nie gedacht, dass diese Platzhalter Inhalte enthalten könnten. Vielen Dank!
JayC

1
Vielen Dank an @JayC. Der RadCodeBlock war aus verschiedenen Gründen der einzige Vorschlag auf dieser Seite, der mit dem von mir geerbten Code funktioniert hat.
Shiser

Dies tritt auch bei registrierten DevExpress-Steuerelementen auf. Ich habe zwei Webanwendungen mit fast identischem Code, Konfiguration und Masterseiten. Nur für DevExpress ist eine solche Problemumgehung erforderlich. Ich denke, das hat etwas mit dem HTTP-Handler, den Ressourcen-Assemblys oder so etwas zu tun, das die Pipeline durcheinander bringt. Wir entfernen uns jetzt von Bibliotheken von Drittanbietern zugunsten von JQuery und MVC, wodurch Sie komplexe serverseitige Codes / Handler vermeiden können.
Tony Wall

Tatsächlich reicht es aus, es mit <div runat = "server"> <% = (...)%> </ div> zu verpacken
Zbigniew Wiadro

5
@Teomanshipahi Es ist eigentlich ziemlich einfach - die Verwendung von Codeblöcken innerhalb eines Containers bedeutet, dass Sie Controlsdiesen Container nicht mehr aktualisieren können. Dies nutzt dieses Verhalten im Wesentlichen aus, indem der Codeblock eingefügt wird in einem separaten Behälter - so dass der Fehler nur angezeigt, wenn Sie ändern wollen Controlsvon den PlaceHolder, anstatt der übergeordneten Steuerung. PlaceHolderist eine gute Wahl dafür, weil es keinen eigenen Code hat (im Gegensatz zu sagen Paneloder <div runat="server">). Obwohl ich es normalerweise umgekehrt verwende - setzen Sie die Steuerelemente ein, die ich ändern muss PlaceHolder.
Luaan

55

Ich kann bestätigen, dass das Verschieben des Javascript mit <% %>Tags vom Kopf zum Formular-Tag diesen Fehler behebt

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


1
Ja, gerade bestätigt, das Entfernen von ASP-Tags <%%> vom Kopf behebt diesen Fehler.
Corgalore

+1, ebenfalls bestätigt. Für mich lag das problematische Skript jedoch sowohl außerhalb des Kopfes als auch der Formelemente.
user420667

Bestätigt. Funktioniert wie ein Zauber für mich. Vergessen Sie nur nicht, die Skripte auf Ihrer Masterseite zu überprüfen, da dies derjenige war, der mir Probleme bereitete, und ich verbrachte etwa eine halbe Stunde damit, herauszufinden, dass es nicht mein Aspx war: P
Luis Hernández

Ja, das hat auch bei mir funktioniert, aber warum? Ist das <HEAD> -Tag in einer Master-Datei nur für die Master-Datei und keine Sub-Aspx-Dateien gedacht? Ich frage, weil ich versuche, JS-Code auf einer Sub-Aspx-Seite auszuführen, die sich in der Master-Datei befindet.
Fandango68

31

Platzieren Sie das Javascript unter einem div-Tag.

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

Es wird funktionieren !!


5
Oder verwenden Sie besser einen Platzhalter, damit kein zusätzlicher HTML-Code ausgegeben wird.
Chris Haines

1
Dies funktioniert, obwohl Visual Studio angibt, dass es gegen den HTML5-Standard verstößt, ein <div> in einem <head> zu verschachteln.
Adi Inbar

IMHO, nicht die beste Lösung, wenn HTML5 nicht validiert, vermeiden Sie div in headAbschnitt.
PreguntonCojoneroCabrón

8

Sie können dieselbe Funktionalität ausführen, wenn Sie den Skriptmanager auf Ihrer Seite verwenden. Sie müssen das Skript einfach so registrieren

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

ScriptManagerkeine Skripte im Kopfbereich hinzufügen ?
Kiquenet

5

Ich hatte das gleiche Problem in der Benutzersteuerung. Meine Seite, auf der sich das Steuerelement befand, hatte Kommentare im Head-Tag. Ich habe diese Kommentare entfernt. Danach hat alles funktioniert. In einigen Beiträgen wird auch empfohlen, Skripte aus dem Kopf zu entfernen und im Text zu platzieren.


5

Ich habe es <%# %>ohne Erfolg versucht . Dann habe ich Page.Header.DataBind();meinen Code hinter geändert this.Header.DataBind();und es hat gut funktioniert.


4

In meinem Fall habe ich ersetzt <%= %>mit <%# %>, und es funktionierte!


3

Behalten Sie den Java-Skriptcode im Body-Tag

<body> 
   <script type="text/javascript">
   </script>
</body>

2

Die Datenbindungstechnik "<% #" funktioniert nicht direkt in <link> -Tags im <head> -Tag:

<head runat="server">

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

</head>

Der obige Code wird ausgewertet

<head>

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

</head>

Stattdessen sollten Sie Folgendes tun (beachten Sie die beiden doppelten Anführungszeichen):

<head runat="server">

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

</head>

Und Sie erhalten das gewünschte Ergebnis:

<head>

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

</head>

2

Ich hatte dieses Problem, aber nicht über den Header. Mein Platzhalter war im Körper. Also habe ich alles <%=durch ersetzt <%#und getan

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

und es hat funktioniert.


1

Eine alternative Möglichkeit besteht darin, eine andere ASPX-Seite als die Seite zu verwenden, auf die Sie verlinken möchten.

So sieht der Header der Masterpage aus:

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

Das referenzierte ASPX-Formular enthält Ihren Inhalt:

<%@ 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;
}

Schließlich benötigen Sie die ASPX-Seite, um dem Browser mitzuteilen, dass Sie CSS-Inhalte senden:

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

1

Ich stand auch vor dem gleichen Problem. Ich fand die Lösungen wie folgt.

Lösung 1: Ich habe mein Skript-Tag im Body behalten.

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

Jetzt werden Konflikte bezüglich der Tags gelöst.

Lösung 2:

Wir können auch eine der oben genannten Lösungen lösen, z. B. Ersetzen Sie den Codeblock durch <% # anstelle von <% =. Das Problem ist jedoch, dass nur der relative Pfad angegeben wird . Wenn Sie wirklich absoluten Weg wollen wollen, wird es nicht funktionieren.

Lösung 1 funktioniert bei mir. Als nächstes haben Sie die Wahl.


1

Ich hatte das gleiche Problem, aber es hatte nichts mit JavaScript zu tun. Betrachten Sie diesen 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>

In dieser Situation wird der gleiche Fehler angezeigt, obwohl PlaceHolders keine schädlichen Codeblöcke enthält. Dies geschieht aufgrund der Nicht-Server-Steuerung, die hdnTest Codeblöcke verwendet.

Fügen Sie einfach runat = server zum hdnTest hinzu und das Problem ist gelöst.


1

Ich habe einen ähnlichen Fehler gelöst, indem ich das <script>Innere contentplaceholderin das Innere <head>und nicht das <script>Äußere in das contentplaceholderInnere gesteckt habe<head>


1

Ich hatte das gleiche Problem mit unterschiedlichen Umständen.
Ich hatte ein einfaches Element im Body-Tag.
Die Lösung war:

<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

Ich hatte das gleiche Problem mit meinem System. Ich habe den JavaScript-Code von meiner Seite entfernt und ihn kurz vor dem Schließen des Body-Tags auf body gesetzt


0

In einigen Fällen funktionieren ResolveUrl und ResolveClientUrl, jedoch nicht immer, insbesondere bei js-Skriptdateien. Was passiert ist, dass es für einige Seiten funktioniert, aber wenn Sie zu anderen Seiten navigieren, funktioniert es möglicherweise aufgrund des relativen Pfads dieser bestimmten Seite nicht.

Schließlich ist mein Vorschlag, immer eine vollständige Überprüfung Ihrer Websiteseiten durchzuführen, um festzustellen, ob alle Ihre Javascript-Referenzen in Ordnung sind oder nicht. Öffnen Sie Ihre Website in Google Chrome -> klicken Sie mit der rechten Maustaste auf die Seite -> klicken Sie auf Quellseite anzeigen -> HTML wird angezeigt -> klicken Sie jetzt auf Ihre JS-Hyperlinks. Wenn es gut funktioniert, sollte es die js-Datei in einem anderen Browserfenster öffnen, sonst wird es nicht geöffnet.


0

Versuchen Sie, Ihren Java-Skriptcode außerhalb des Head-Tags zu schreiben, er wird definitiv funktionieren. Er wurde behoben, wenn ich meinen Java-Skriptcode kopiere und am Ende der Seite einfüge. In der vorherigen Version wurde es jetzt in das HEAD-Tag eingefügt, kurz bevor das Formular-Tag geschlossen wurde.

    </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

Entfernen Sie den Teil mit den Server-Tags und platzieren Sie ihn an einer anderen Stelle, wenn Sie dynamische Steuerelemente aus dem Code dahinter hinzufügen möchten

Ich habe mein JavaScript aus dem Kopfbereich der Seite entfernt, es dem Hauptteil der Seite hinzugefügt und zum Laufen gebracht


0

In meinem Fall habe ich diesen Fehler erhalten, weil ich InnerText fälschlicherweise auf ein div mit HTML darin gesetzt habe.

Beispiel:

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>

-1

Tags <%= %>funktionieren nicht in einem Tag mit runat="server". Bewegen Sie den Code mit <%= %>in runat="server"zu einem anderen Tag ( body, head, ...) oder Entfernen runat="server"aus dem Behälter.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.