«Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода» - PullRequest
359 голосов
/ 23 апреля 2009

Я пытаюсь создать простой пользовательский элемент управления, который является слайдером. Когда я добавляю AjaxToolkit SliderExtender в пользовательский элемент управления, я получаю эту ошибку (* & $ # () @ #:

    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

Я попытался поместить заполнитель в пользовательский элемент управления и добавить текстовое поле и расширитель ползунка программно, но все еще получаю сообщение об ошибке.

Вот простой код:

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

В чем проблема?

Ответы [ 22 ]

2 голосов
/ 16 августа 2013

Храните код java-скрипта внутри тега body

<body> 
   <script type="text/javascript">
   </script>
</body>
1 голос
/ 22 января 2013

У меня была такая же проблема, но она не имела ничего общего с 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 голос
/ 08 октября 2011

Альтернативный способ - использовать другую страницу .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";
}
1 голос
/ 05 июля 2018

У меня была такая же проблема с моей системой, я удалил код JavaScript со своей страницы и поместил его в тело непосредственно перед закрытием тега тела

1 голос
/ 19 февраля 2013

Я тоже сталкивался с такой же проблемой. Я нашел решения, как следующие.

Решение 1: Я сохранил свой тег сценария в теле.

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

Теперь конфликты относительно тегов разрешатся.

Решение 2:

Мы также можем решить это одно из приведенных выше решений, таких как Заменить блок кода на <% # вместо <% = </strong> Но проблема в том, что он даст только относительный путь . Если вы действительно хотите абсолютный путь , он не будет работать.

Решение 1 работает для меня. Далее ваш выбор.

1 голос
/ 09 декабря 2013

Я решил ошибку, похожую на эту, поместив <script> внутри contentplaceholder внутри <head> вместо того, чтобы поместить <script> вне указанного contentplaceholder внутри <head>

1 голос
/ 06 февраля 2018

У меня была та же проблема с разными обстоятельствами.
У меня был простой элемент внутри тега 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";
}
0 голосов
/ 21 декабря 2011

В некоторых случаях ResolveUrl и ResolveClientUrl работают, но не всегда, особенно в случае файлов сценариев js. В некоторых случаях это работает для некоторых страниц, но при переходе на другие страницы оно может не работать из-за относительного пути к этой конкретной странице.

Итак, наконец, я предлагаю всегда перепроверять страницы вашего сайта, чтобы убедиться, что все ваши ссылки на JavaScript хороши или нет. Откройте свой сайт в Google Chrome -> щелкните правой кнопкой мыши на странице -> нажмите кнопку просмотра исходной страницы -> появится HTML -> теперь щелкните ваши гиперссылки JS; если он работает нормально, он должен открыть файл js в другом окне браузера, иначе он не откроется.

0 голосов
/ 17 марта 2016

В моем случае я получил эту ошибку, потому что я неправильно устанавливал 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>
0 голосов
/ 15 июля 2014

Удалите деталь, имеющую серверные теги, и поместите ее где-нибудь еще, если вы хотите добавить динамические элементы управления из кода позади

Я удалил свой JavaScript из раздела head страницы и добавил его в тело страницы, и он заработал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...