"Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода"
Я пытаюсь создать простой пользовательский элемент управления, который является слайдером. Когда я добавляю AjaxToolkit SliderExtender в пользовательский элемент управления, я получаю эту ошибку (*&$#()@#:
Ошибка сервера в приложении '/' Коллекция Controls не может быть изменена, потому что элемент управления содержит блоки кода (то есть ``). Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде. Сведения об исключении: System.Web.HttpException: коллекцию Controls нельзя изменить, поскольку элемент управления содержит блоки кода (т. Е. ``). Ошибка источника: во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже. Трассировка стека: [HttpException (0x80004005): Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода (т. Е. ``).] System.Web.UI.ControlCollection.Add(дочерний элемент управления) +8677431 AjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences Control (элемент управления) в d:\E\AjaxTk-AjaxControlToolkit\Release\AjaxControlToolkit\ExtenderBase\ScriptObjectBuilder.cs:293 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 Информация о версии: Microsoft .NET Framework Версия:2.0.50727.3074; ASP.NET версия: 2.0.50727.3074
Я попытался поместить заполнитель в пользовательский элемент управления и добавить текстовое поле и расширитель ползунка программно, и все еще получаю сообщение об ошибке.
Вот простой код:
<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>
В чем проблема?
22 ответа
Сначала запустите блок кода с <% # вместо <% =:
<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>
Это изменяет блок кода с блока кода Response.Write на выражение привязки данных.
поскольку <%# ... %>
выражения привязки данных не являются блоками кода, CLR не будет жаловаться. Затем в коде главной страницы вы добавите следующее:
protected void Page_Load(object sender, EventArgs e)
{
Page.Header.DataBind();
}
Я просто столкнулся с этой проблемой, но нашел другое решение.
Я обнаружил, что обертывание блоков кода тегом asp:PlaceHolder решает проблему.
<asp:PlaceHolder runat="server">
<meta name="ROBOTS" content="<%= this.ViewData["RobotsMeta"] %>" />
</asp:PlaceHolder>
(CMS, которую я использую, вставляет в раздел заголовка какой-то код, который ограничивает меня от добавления пользовательских блоков управления с различной информацией, такой как мета-теги и т. Д., Так что это единственный способ, которым он работает для меня.)
Я могу подтвердить, что перемещение JavaScript с <% %>
теги от головы до формы тег исправляет эту ошибку
http://italez.wordpress.com/2010/06/22/ajaxcontroltoolkit-calendarextender-e-strana-eccezione/
Поместите JavaScript под тегом div.
<div runat="server"> //div tag must have runat server
//Your Jave script code goes here....
</div>
Это сработает!!
Вы можете сделать ту же функциональность, если вы используете менеджер скриптов на своей странице. Вы должны просто зарегистрировать скрипт, как это
<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true" EnablePageMethods="true">
<Scripts>
<asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" />
</Scripts>
</asp:ScriptManager>
Я пытался с помощью <%# %>
без успеха. Потом я поменял Page.Header.DataBind();
в моем коде позади this.Header.DataBind();
и это работало нормально.
У меня была такая же проблема в пользовательском элементе управления. На моей странице, на которой размещался элемент управления, были комментарии в теге head, я удалил эти комментарии, потом все заработало. В некоторых сообщениях также предлагается удалить скрипты из головы и поместить их в тело.
Держите код java-скрипта внутри тега body
<body>
<script type="text/javascript">
</script>
</body>
У меня была эта проблема, но не через Заголовок. Мой заполнитель был в теле. Поэтому я заменил все <%=
с <%#
и сделал
protected void Page_Load(object sender, EventArgs e)
{
Page.Header.DataBind();
}
и это сработало.
Метод привязки данных<% # не будет работать напрямую внутри тегов в теге
:<head runat="server">
<link rel="stylesheet" type="text/css"
href="css/style.css?v=<%# My.Constants.CSS_VERSION %>" />
</head>
Приведенный выше код будет оцениваться как
<head>
<link rel="stylesheet" type="text/css"
href="css/style.css?v=<%# My.Constants.CSS_VERSION %>" />
</head>
Вместо этого вы должны сделать следующее (обратите внимание на две двойные кавычки внутри):
<head runat="server">
<link rel="stylesheet" type="text/css"
href="css/style.css?v=<%# "" + My.Constants.CSS_VERSION %>" />
</head>
И вы получите желаемый результат:
<head>
<link rel="stylesheet" type="text/css" href="css/style.css?v=1.5" />
</head>
Альтернативный способ - заставить другую страницу.aspx выступать в качестве страницы, на которую вы хотите сослаться.
Вот как выглядит заголовок главной страницы:
<head runat="server">
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
<link href="CSS/AccordionStyles.aspx" rel="stylesheet" type="text/css" />
</head>
Ссылочная форма.aspx содержит ваш контент:
<%@ 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;
}
Наконец, вам нужна страница.aspx, чтобы сообщить браузеру, что вы отправляете контент CSS:
protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "text/css";
}
Я решил ошибку, похожую на эту, поставив <script>
внутри contentplaceholder
внутри <head>
вместо того, чтобы положить <script>
вне сказанного contentplaceholder
внутри <head>
У меня была та же проблема, но она не имела ничего общего с JavaScript. Рассмотрим этот код:
<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>
В этой ситуации вы получите ту же ошибку, даже если у PlaceHolders нет вредоносных блоков кода, это происходит из-за несерверного управления hdnTest использует блоки кода.
Просто добавьте runat=server в hdnTest, и проблема решена.
Я также столкнулся с той же проблемой. Я нашел решения, как следующие.
Решение 1: я сохранил свой скрипт тег в теле.
<body>
<form> . . . . </form>
<script type="text/javascript" src="<%= My.Working.Common.Util.GetSiteLocation()%>Scripts/Common.js"></script> </body>
Теперь конфликты относительно тегов разрешатся.
Решение 2:
Мы также можем решить это одно из приведенных выше решений, таких как Заменить блок кода на <% # вместо <% =. Но проблема в том, что он даст только относительный путь. Если вы хотите действительно абсолютный путь, он не сработает.
Решение 1 работает для меня. Далее ваш выбор.
У меня была такая же проблема с моей системой, я удалил код JavaScript со своей страницы и поместил его в тело непосредственно перед закрытием тега тела
У меня была такая же проблема с разными обстоятельствами.
У меня был простой элемент внутри тега body.
Решение было:
<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";
}
В моем случае я получил эту ошибку, потому что я неправильно установил InnerText в div с html внутри.
Пример:
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>
В некоторых случаях ResolveUrl и ResolveClientUrl работают, но не всегда, особенно в случае файлов сценариев js. Что происходит, это работает для некоторых страниц, но когда вы переходите на другие страницы, это может не работать из-за относительного пути к этой конкретной странице.
Итак, наконец, я предлагаю всегда перепроверять страницы вашего сайта, чтобы убедиться, что все ваши ссылки на JavaScript хороши или нет. Откройте свой сайт в Google Chrome -> щелкните правой кнопкой мыши на странице -> нажмите кнопку просмотра исходной страницы -> появится HTML -> теперь щелкните ваши гиперссылки JS; если он работает нормально, он должен открыть файл js в другом окне браузера, иначе он не откроется.
Попробуйте написать код Java-сценария вне тега head, он определенно будет работать. Он разрешается, когда я копирую и вставляю свой код Java-сценария в конец страницы. В предыдущем он помещался в тег HEAD, прямо перед закрытием тега формы.
</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>
Удалите часть, которая имеет серверные теги, и поместите ее где-нибудь еще, если вы хотите добавить динамические элементы управления из кода позади
Я удалил свой JavaScript из заголовка раздела страницы и добавил его в тело страницы, и он заработал
Теги <%= %>
не работает в тег с runat="server"
, Переместите свой код с <%= %>
в runat="server"
на другой тег (body
, head
... или удалить runat="server"
из контейнера.