控件集合无法修改,因为控件包含代码块(即 <% ... %>)

Posted

技术标签:

【中文标题】控件集合无法修改,因为控件包含代码块(即 <% ... %>)【英文标题】:The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>) 【发布时间】:2011-02-14 17:36:29 【问题描述】:

我正在尝试在 C# 中创建动态元标记,但它给出了以下错误:

无法修改 Controls 集合,因为该控件 包含代码块(即 )

这是我添加的代码:

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

非常感谢。

【问题讨论】:

你的 .aspx 标记中必须有脚本标签 您能显示代码中 的位置吗? 有什么办法可以通过c#为动态标签添加代码 这是我的代码在 aspx 中的样子 【参考方案1】:

很难确定,因为您没有包含很多细节,但我认为您的Page.Header 中有&lt;% ... %&gt; 代码块(指的是&lt;head runat="server"&gt; - 可能在母版页)。因此,当您尝试将项目添加到该控件的 Controls 集合时,您会在此问题的标题中看到错误消息。

如果我是对的,那么解决方法是在&lt;% ... %&gt; 代码块周围加上一个&lt;asp:placeholder runat="server"&gt; 标记。这使代码块成为占位符控件的子级,而不是Page.Header 控件的直接子级,但它根本不会更改呈现的输出。现在代码块不是Page.Header 的直接子代,您可以将内容添加到标头的控件集合中而不会出错。

同样,某处存在代码块,否则您不会看到此错误。如果它不在您的 aspx 页面中,那么我首先要看的是您的 aspx 顶部的 MasterPageFile 属性引用的文件。

【讨论】:

感谢它起作用了,我用不同的占位符包装了我的 css 内容,它起作用了。 我尝试了其他一些答案,这是唯一对我有用的答案!感谢分享! 帮我解决了,我应该给你买一瓶啤酒(或九瓶)。 谢谢,今天让我头疼不已。 哇,谢谢。多年来,我一直在用大量骇人听闻的解决方法来解决网络表单中的这个问题。占位符效果很好,而且它几乎没有我的其他解决方案那么难看。【参考方案2】:

以防万一您使用 Telerik 组件并且您的 javascript 中有 引用,然后使用 RadScriptBlock 包装您的脚本标签。

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

问候厄瓦尔

【讨论】:

这对我有用。想知道为什么没有 标签会出现问题。【参考方案3】:

在"The Controls collection cannot be modified because the control contains code blocks"查看解决方案

accepted solution on the other question 为我工作——将&lt;%= 的实例更改为&lt;%#,这将代码块从Response.Write 转换为评估块,不受相同限制的限制。

但在这种情况下,就像 accepted solution here 建议的那样,您应该将控件添加到母版页 ContentPlaceHolder 元素以外的其他内容,即建议的 asp:Placeholder 控件。

【讨论】:

【参考方案4】:

我遇到了同样的问题,我通过这种方式解决了:

而不是将元数据添加到导致与您相同的错误的当前页眉:

Page.Header.Controls.Add(meta);

我用这个代替:

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

它就像一个魅力。

【讨论】:

我们纯粹通过代码构建页面的一部分,这最终成为我们的问题以及解决方案(如果您的母版页中有 Head 占位符,请将其添加到 Head 占位符)。奇怪的是,这只是某些环境下的问题,而不是全部,所以它也可能是某个地方的配置问题。不管怎样,这行得通。谢谢!【参考方案5】:

对于那些使用 Ovar 提到的 Telerik 的人,请确保将 javascript 包装在

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

由于 Telerik 在查找元素时无法识别 ,并且如果您的 javascript 代码未包装, 将给您一个错误。

【讨论】:

【参考方案6】:

不能真正解决您的问题,但它是一个重要的替代方案。

如果你想在页面的开头(在&lt;body&gt;元素内)添加自定义html,你可以使用Page.ClientScript.RegisterClientScriptBlock()

虽然该方法称为“脚本”,但可以添加任意字符串,包括html。

【讨论】:

【参考方案7】:

在ContentPlaceholder里面,放占位符控件。比如这样,

<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);

【讨论】:

以上是关于控件集合无法修改,因为控件包含代码块(即 <% ... %>)的主要内容,如果未能解决你的问题,请参考以下文章

控件集合无法修改,因为控件包含代码块(即 <% ... %>)

无法修改 Controls 集合,因为控件包含代码块(即 <% ... %> ),动态添加具有 Masterpages 的控件

asp.net c# javascript 控件集合无法修改,因为控件包含代码块(即<% ... %>)

在服务器端控件中使用 <%= %> 会导致无法修改 Controls 集合,因为控件包含代码块(即 <% ... %>)

无法修改 Controls 集合,因为该控件包含代码块(即 <% ... %>)。Telerik.Web.UI.RadAjaxControl.MoveUpdatePanel

无法修改 Controls 集合,因为该控件包含代码块(即 <% ...%>)ajax 工具包 html 编辑器