"Коллекцию Controls нельзя изменить, так как элемент управления содержит блоки кода"

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

    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

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

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

<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 ответов


сначала запустите блок кода с

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

это изменяет блок кода из ответа.Запись блока кода в выражение привязки данных.
С <%# ... %> выражения привязки данных не являются блоками кода, среда CLR не будет жаловаться. Затем в коде для главной страницы вы добавите следующее:

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

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

Я обнаружил, что обертывание блоков кода с помощью ASP: PlaceHolder-tag решает проблему.

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

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


Я могу подтвердить, что перемещение 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>

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


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

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

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


Я попытался с помощью <%# %> без успеха. Потом я изменился Page.Header.DataBind(); в моем коде позади this.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=&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>

держите код сценария java внутри тега body

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

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

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

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


альтернативный способ-иметь другой .страница aspx действует как страница, на которую вы хотите ссылаться.

вот как выглядит заголовок Masterpage:

<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: Я сохранил бирку сценария в теле.

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

теперь конфликты относительно тегов будут разрешены.

решение 2:

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

Решение 1 работает для меня. Следующий-ваш выбор.


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

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

просто добавьте runat=server в hdnTest, и проблема будет решена.


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


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


для некоторых случаев 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 из главного раздела страницы и добавил его в тело страницы и заставил его работать


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

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

Теги <%= %> не работает в тег runat="server". Переместите код с помощью <%= %> на runat="server" в другой тег (body, head, ...), или удалить runat="server" из контейнера.