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

时间:2011-02-14 17:36:29

标签: c#

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

  

由于控件无法修改Controls集合   包含代码块(即<%...%>)

这是我添加的代码:

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

非常感谢。

7 个答案:

答案 0 :(得分:169)

很难说清楚,因为你没有包含很多细节,但我认为正在发生的事情是<% ... %>中有Page.Header个代码块(指的是{{} 1}} - 可能在母版页中)。因此,当您尝试将项添加到该控件的Controls集合时,您将在此问题的标题中收到错误消息。

如果我是对的,那么解决方法是在<head runat="server">代码块周围包含<asp:placeholder runat="server">标记。这使得代码块成为占位符控件的子代,而不是<% ... %>控件的直接子代,但它根本不会更改呈现的输出。既然代码块不是Page.Header的直接子代,您可以在没有错误的情况下向标题的控件集合添加内容。

同样,某处有一个代码块,或者你不会看到这个错误。如果它不在您的aspx页面中,那么我看的第一个地方是您的aspx顶部的Page.Header属性引用的文件。

答案 1 :(得分:14)

如果您使用的是Telerik组件,并且您的javascript中有&lt;%= ....%&gt;然后使用RadScriptBlock包装脚本标记。

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

关心Örvar

答案 2 :(得分:1)

查看"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控件。

答案 3 :(得分:1)

我遇到了同样的问题:

不是将元数据添加到当前页面标题中,而是导致出现与您相同的错误:

Page.Header.Controls.Add(meta);

我改为使用了这个:

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

它就像一个魅力。

答案 4 :(得分:0)

并非真正解决您的问题,但它是一个重要的选择。

如果要将自定义html添加到页面的开头(<body>元素内),可以使用Page.ClientScript.RegisterClientScriptBlock()

虽然该方法被称为&#34; script&#34;,但你可以添加任意字符串,包括html。

答案 5 :(得分:0)

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

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

由于Telerik没有识别&lt;%#%&gt;在寻找元素时&lt;%=%&gt;如果您的javascript代码未被包装,则会给您一个错误。

答案 6 :(得分:0)

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