Коллекция 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);