控件集合无法修改,因为控件包含代码块(即 <% ... %>)
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#为动态标签添加代码很难确定,因为您没有包含很多细节,但我认为您的Page.Header
中有<% ... %>
代码块(指的是<head runat="server">
- 可能在母版页)。因此,当您尝试将项目添加到该控件的 Controls 集合时,您会在此问题的标题中看到错误消息。
如果我是对的,那么解决方法是在<% ... %>
代码块周围加上一个<asp:placeholder runat="server">
标记。这使代码块成为占位符控件的子级,而不是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>
问候厄瓦尔
【讨论】:
这对我有用。想知道为什么没有在"The Controls collection cannot be modified because the control contains code blocks"查看解决方案
accepted solution on the other question 为我工作——将<%=
的实例更改为<%#
,这将代码块从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】:不能真正解决您的问题,但它是一个重要的替代方案。
如果你想在页面的开头(在<body>
元素内)添加自定义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