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

Я пытаюсь создать простой пользовательский элемент управления, который является слайдером. Когда я добавляю 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>

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

Ответ 1

Сначала запустите блок кода с <% # вместо <% =:

<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();    
}

Ответ 2

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Удаление script из тегов заголовков, работающих для меня.

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

и он работал.

Ответ 11

Альтернативный способ состоит в том, чтобы другая страница .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";
}

Ответ 12

У меня была такая же проблема, но она не имела никакого отношения к 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 и проблема будет решена.

Ответ 13

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

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

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

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

Решение 2:

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

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

Ответ 14

Технология привязки "<% #" не будет непосредственно работать внутри <link> теги в <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=&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>

Ответ 15

Сохраните код java script внутри тега body

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

Попробуйте написать код java script вне заголовка, он определенно будет работать. Он решил, когда я копирую и вставляю код Java script в конец страницы. В предыдущем его помещали в тег 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>

Ответ 19

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

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

Ответ 20

Хорошо для меня перемещение script с головы до конца страницы. Разум, контроль не был загружен к тому времени, когда asp пытается найти его в голове.

Ответ 21

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

Ответ 22

весь код javascript должен находиться в div runat = server      <telerik:RadCodeBlock ID="rcbScriptBlock" runat="server">

Ответ 23

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