it-swarm-ru.tech

Коллекция Controls не может быть изменена, потому что элемент управления содержит блоки кода (т.е. <% ...%>)

Я пытаюсь создать динамические метатеги в C #, но выдает следующую ошибку:

Коллекция Controls не может быть изменена, потому что элемент управления содержит блоки кода (т. е. <% ...%>)

Это код, который я добавил:

HtmlMeta meta = new HtmlMeta();
meta.Name = "keywords";
meta.Content = "book,paper";
Page.Header.Controls.Add(meta);

Большое спасибо.

52
jack

Трудно сказать наверняка, потому что вы не включили много деталей, но я думаю, что происходит то, что внутри вашего <% ... %> есть блоки кода Page.Header (что относится к <head runat="server"> - возможно, на главной странице). Поэтому, когда вы пытаетесь добавить элемент в коллекцию Controls этого элемента управления, вы получаете сообщение об ошибке в заголовке этого вопроса.

Если я прав, то обходной путь - обернуть тег <asp:placeholder runat="server"> вокруг блока кода <% ... %>. Это делает кодовый блок дочерним по отношению к элементу управления Placeholder, вместо того, чтобы быть прямым дочерним элементом по отношению к элементу управления Page.Header, но это вовсе не меняет отображаемый вывод. Теперь, когда блок кода не является прямым потомком Page.Header, вы можете добавлять вещи в коллекцию элементов управления заголовка без ошибок.

Опять же, где-то есть блок кода, иначе вы не увидите эту ошибку. Если его нет на вашей странице aspx, то в первую очередь я бы посмотрел файл, на который ссылается атрибут MasterPageFile в верхней части aspx.

165
Joel Mueller

На всякий случай, если вы используете компоненты Telerik и у вас есть ссылка в вашем javascript с <% = ....%>, тогда оберните ваш скрипт-тег RadScriptBlock. 

 <telerik:RadScriptBlock ID="radSript1" runat="server">
   <script type="text/javascript">
        //Your javascript
   </script>
</telerik>

С уважением, Эрвар

14
Örvar

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

принятое решение по другому вопросу сработало для меня - изменить экземпляры <%= на <%#, что преобразует блок кода из Response.Write в блок оценки, который не ограничен теми же ограничениями.

В этом случае, однако, как и принятое решение здесь предлагает, вы должны добавить элементы управления к чему-то другому, чем элемент ContentPlaceHolder главной страницы, а именно предложенный элемент управления asp:Placeholder.

1
drzaus

У меня была та же проблема, что я решил таким образом:

Вместо добавления мета в заголовок текущей страницы, которая вызвала ту же ошибку, что и у вас:

Page.Header.Controls.Add(meta);

Я использовал это вместо:

 Master.FindControl("YourHeadContentPlaceHolder").Controls.Add(meta);

и это работает как шарм.

0
IRONicMAN

Не совсем решить ваш вопрос, но это важная альтернатива.

Если вы хотите добавить собственный html в начало страницы (внутри элемента <body>), вы можете использовать Page.ClientScript.RegisterClientScriptBlock().

Хотя метод называется «скрипт», но вы можете добавить произвольную строку, в том числе HTML.

0
Gqqnbig

Для тех, кто использует Telerik, как упомянуто Оваром, убедитесь, что вы завернули свой JavaScript в 

 <telerik:RadScriptBlock ID="radSript1" runat="server">
   <script type="text/javascript">
        //Your javascript
   </script>
</telerik>

Так как Telerik не распознает <% #%> при поиске элемента, а <% =%> выдаст вам ошибку, если ваш код javascript не будет упакован.

0
hakunamatatakid

Внутри ContentPlaceholder поместите элемент управления placeholder. Например, вот так:

<asp:Content ID="header" ContentPlaceHolderID="head" runat="server">
       <asp:PlaceHolder ID="metatags" runat="server">
        </asp:PlaceHolder>
</asp:Content>

Код позади:

HtmlMeta hm1 = new HtmlMeta();
hm1.Name = "Description";
hm1.Content = "Content here";
metatags.Controls.Add(hm1);
0
chetan