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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

С уважением Örvar

Ответ 3

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

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

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

Ответ 4

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

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

Page.Header.Controls.Add(meta);

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

Внутри 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);