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" />:
<asp:Label ID="lblSliderValue" runat="server" />
<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?
c#
asp.net
user-controls
Daniel P.
quelle
quelle
@Daniel P
Vorschlag.Antworten:
Starten Sie zuerst den Codeblock mit <% # anstelle von <% =:
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:quelle
#
statt=
. Ich werde das nie verstehen, mache es schon seit Jahren, aber ich wünschte ich wüsste WARUM!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.
(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.)
quelle
Controls
diesen 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 wollenControls
von denPlaceHolder
, anstatt der übergeordneten Steuerung.PlaceHolder
ist eine gute Wahl dafür, weil es keinen eigenen Code hat (im Gegensatz zu sagenPanel
oder<div runat="server">
). Obwohl ich es normalerweise umgekehrt verwende - setzen Sie die Steuerelemente ein, die ich ändern mussPlaceHolder
.Ich kann bestätigen, dass das Verschieben des Javascript mit
<% %>
Tags vom Kopf zum Formular-Tag diesen Fehler behebthttp://italez.wordpress.com/2010/06/22/ajaxcontroltoolkit-calendarextender-e-strana-eccezione/
quelle
Platzieren Sie das Javascript unter einem div-Tag.
Es wird funktionieren !!
quelle
head
Abschnitt.Sie können dieselbe Funktionalität ausführen, wenn Sie den Skriptmanager auf Ihrer Seite verwenden. Sie müssen das Skript einfach so registrieren
quelle
ScriptManager
keine Skripte im Kopfbereich hinzufügen ?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.
quelle
Ich habe es
<%# %>
ohne Erfolg versucht . Dann habe ichPage.Header.DataBind();
meinen Code hinter geändertthis.Header.DataBind();
und es hat gut funktioniert.quelle
In meinem Fall habe ich ersetzt
<%= %>
mit<%# %>
, und es funktionierte!quelle
Behalten Sie den Java-Skriptcode im Body-Tag
quelle
Die Datenbindungstechnik "<% #" funktioniert nicht direkt in <link> -Tags im <head> -Tag:
Der obige Code wird ausgewertet
Stattdessen sollten Sie Folgendes tun (beachten Sie die beiden doppelten Anführungszeichen):
Und Sie erhalten das gewünschte Ergebnis:
quelle
Ich hatte dieses Problem, aber nicht über den Header. Mein Platzhalter war im Körper. Also habe ich alles
<%=
durch ersetzt<%#
und getanund es hat funktioniert.
quelle
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:
Das referenzierte ASPX-Formular enthält Ihren Inhalt:
Schließlich benötigen Sie die ASPX-Seite, um dem Browser mitzuteilen, dass Sie CSS-Inhalte senden:
quelle
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.
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.
quelle
Ich hatte das gleiche Problem, aber es hatte nichts mit JavaScript zu tun. Betrachten Sie diesen Code:
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.
quelle
Ich habe einen ähnlichen Fehler gelöst, indem ich das
<script>
Innerecontentplaceholder
in das Innere<head>
und nicht das<script>
Äußere in dascontentplaceholder
Innere gesteckt habe<head>
quelle
Ich hatte das gleiche Problem mit unterschiedlichen Umständen.
Ich hatte ein einfaches Element im Body-Tag.
Die Lösung war:
quelle
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
quelle
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.
quelle
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.
quelle
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
quelle
In meinem Fall habe ich diesen Fehler erhalten, weil ich InnerText fälschlicherweise auf ein div mit HTML darin gesetzt habe.
Beispiel:
quelle
Tags
<%= %>
funktionieren nicht in einem Tag mitrunat="server"
. Bewegen Sie den Code mit<%= %>
inrunat="server"
zu einem anderen Tag (body
,head
, ...) oder Entfernenrunat="server"
aus dem Behälter.quelle