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

325

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

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

  • 8
    Для меня причиной этой ошибки было использование <% = Resolve (); Функция%> внутри тегов <script> и <link>. Я наконец исправил это. Вместо того, чтобы удалять нарушающий код в теге head, который обычно вызывает эту ошибку. Просто поместите весь нарушающий код в тег <asp: ContentPlaceHolder> </ asp: ContentPlaceHolder>.
  • 0
    stackoverflow.com/questions/4995274/… Содержит более @Daniel P объяснение для предложения @Daniel P
Теги:
user-controls

23 ответа

466
Лучший ответ

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

<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();    
}
  • 0
    Я не получаю эту ошибку, но я использую обозначение =. Тем не менее: я видел мой код сбоя с вышеописанной проблемой. Что может вызвать это (почему это работает хорошо со мной)?
  • 3
    Кажется, у меня возникла эта проблема после перехода на ASP.NET 4. Изолирована ли она от новой платформы?
Показать ещё 5 комментариев
231

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

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

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

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

  • 11
    Потрясающие. Будучи бывшим пользователем элементов управления Telerik, я часто использовал их «RadCodeBlock» для той же цели, но меня всегда раздражал тот факт, что я ничего не знал, кроме этого (или, как уже упоминалось, перемещение кода в тег сделан для запуска на стороне сервера). Я никогда не знал, что эти заполнители могут иметь контент внутри них. Спасибо!
  • 1
    На самом деле, спасибо @JayC, RadCodeBlock был единственным предложением на этой странице, которое работало с унаследованным кодом по разным причинам.
Показать ещё 4 комментария
47

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

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

  • 1
    Да, только что подтвердил: удаление тегов ASP <%%> из заголовка исправляет эту ошибку.
  • 0
    +1, подтверждено также. Хотя для меня проблемный сценарий находился вне головы и элементов формы.
Показать ещё 2 комментария
27

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

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

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

  • 5
    Или лучше использовать заполнитель, чтобы не выводить лишний HTML-код.
  • 1
    Это работает, хотя Visual Studio заявляет, что нарушает стандарт HTML5, вкладывая <div> в <head>.
Показать ещё 1 комментарий
8

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

<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true"   EnablePageMethods="true">  
<Scripts>
      <asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" />
</Scripts>
</asp:ScriptManager>
  • 0
    ScriptManager не добавлять скрипты в главном разделе ?
7

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

5

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

4

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

4

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

2

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

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

и он работал.

1

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

1

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

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

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

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

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

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

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

Решение 2:

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

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

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>

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

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

1

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

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

0

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

0

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

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

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

0

Попробуйте написать код 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>
0

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

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

-2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню