«Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода» - 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 ]

481 голосов
/ 24 июля 2009

Сначала начните блок кода с <% # вместо <% =: </p>

<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();    
}
244 голосов
/ 20 апреля 2011

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

Я обнаружил, что оборачивание блоков кода тегом asp: PlaceHolder решает проблему.

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

(CMS, которую я использую, вставляет в раздел заголовка какой-то код, который ограничивает меня от добавления пользовательских блоков управления с различной информацией, такой как мета-теги и т. Д., Так что это единственный способ, которым он работает для меня.)

52 голосов
/ 23 июня 2010

Я могу подтвердить, что перемещение javascript с тегами <% %> из головы в тег формы исправляет эту ошибку

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

31 голосов
/ 14 января 2011

Поместите JavaScript под тегом div.

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

Это сработает !!

8 голосов
/ 21 сентября 2010

вы можете выполнять те же функции, если вы используете менеджер скриптов на своей странице. Вы должны просто зарегистрировать скрипт, как это

<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true"   EnablePageMethods="true">  
<Scripts>
      <asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" />
</Scripts>
</asp:ScriptManager>
5 голосов
/ 14 мая 2009

У меня была такая же проблема в пользовательском элементе управления. На моей странице, на которой размещался элемент управления, были комментарии в теге head, я удалил эти комментарии, потом все заработало. Некоторые посты также предлагают удалить скрипты из головы и поместить их в тело.

4 голосов
/ 01 июня 2011

В моем случае я заменил <%= %> на <%# %>, и это сработало!

4 голосов
/ 11 мая 2010

Я пытался использовать <%# %> безуспешно. Затем я изменил Page.Header.DataBind(); в своем коде на this.Header.DataBind();, и он работал нормально.

2 голосов
/ 29 марта 2013

Метод привязки данных <% # не будет работать напрямую внутри тегов <link>в теге :

<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=&lt;%# 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>
2 голосов
/ 06 сентября 2016

У меня была эта проблема, но не через Заголовок. Мой заполнитель был в теле. Поэтому я заменил все <%= на <%# и сделал

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

и это сработало.

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