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

<p>я пытаюсь создать динамические метатеги в c #, но выдает следующую ошибку:</p><blockquote> <p>коллекция controls не может быть изменена, потому что элемент управления содержит блоки кода (т. е. <% ...%>)</p> </blockquote><p>это код, который я добавил:</p><pre><code>htmlmeta meta = new htmlmeta(); meta.name = "keywords"; meta.content = "book,paper"; page.header.controls.add(meta); </code></pre><p>большое спасибо.</p>

<p>трудно сказать наверняка, потому что вы не включили много деталей, но я думаю, что происходит то, что внутри вашего <code><% ... %></code> есть блоки кода <code>page.header</code> (что относится к <code><head runat="server"></code> - возможно, на главной странице). поэтому, когда вы пытаетесь добавить элемент в коллекцию controls этого элемента управления, вы получаете сообщение об ошибке в заголовке этого вопроса.</p><p>если я прав, то обходной путь - обернуть тег <code><asp:placeholder runat="server"></code> вокруг блока кода <code><% ... %></code>. это делает кодовый блок дочерним по отношению к элементу управления placeholder, вместо того, чтобы быть прямым дочерним элементом по отношению к элементу управления <code>page.header</code>, но это вовсе не меняет отображаемый вывод. теперь, когда блок кода не является прямым потомком <code>page.header</code>, вы можете добавлять вещи в коллекцию элементов управления заголовка без ошибок.</p><p>опять же, где-то есть блок кода, иначе вы не увидите эту ошибку. если его нет на вашей странице aspx, то в первую очередь я бы посмотрел файл, на который ссылается атрибут <code>masterpagefile</code> в верхней части aspx.</p>

<p>ознакомьтесь с решениями по адресу <a href="https://stackoverflow.com/questions/778952/the-controls-collection-cannot-be-modified-because-the-control-contains-code-bl">«коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода»</a> </p><p> <a href="https://stackoverflow.com/a/1176779/1037948">принятое решение по другому вопросу</a> сработало для меня - изменить экземпляры <code><%=</code> на <code><%#</code>, что преобразует блок кода из <code>response.write</code> в блок оценки, который не ограничен теми же ограничениями.</p><p>в этом случае, однако, как и <a href="https://stackoverflow.com/a/4995628/1037948">принятое решение здесь</a> предлагает, вы должны добавить элементы управления к чему-то другому, чем элемент contentplaceholder главной страницы, а именно предложенный элемент управления <code>asp:placeholder</code>.</p>

<p>у меня была та же проблема, что я решил таким образом:</p><p>вместо добавления мета в заголовок текущей страницы, которая вызвала ту же ошибку, что и у вас:</p><pre><code>page.header.controls.add(meta); </code></pre><p>я использовал это вместо:</p><pre><code> master.findcontrol("yourheadcontentplaceholder").controls.add(meta); </code></pre><p>и это работает как шарм.</p>

<p>не совсем решить ваш вопрос, но это важная альтернатива.</p><p>если вы хотите добавить собственный html в начало страницы (внутри элемента <code><body></code>), вы можете использовать <code>page.clientscript.registerclientscriptblock()</code>.</p><p>хотя метод называется «скрипт», но вы можете добавить произвольную строку, в том числе html.</p>

<p>внутри contentplaceholder поместите элемент управления placeholder. например, вот так:</p><pre><code><asp:content id="header" contentplaceholderid="head" runat="server"> <asp:placeholder id="metatags" runat="server"> </asp:placeholder> </asp:content> </code></pre><p>код позади:</p><pre><code>htmlmeta hm1 = new htmlmeta(); hm1.name = "description"; hm1.content = "content here"; metatags.controls.add(hm1); </code></pre>