Controls集合不能被修改,因为控件包含代码块(即<%…%>)

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

Controls集合不能被修改,因为控件包含代码块(即<%…%>)

这是我添加的代码:

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

非常感谢你。

很难说清楚,因为你没有包含很多细节,但是我认为是在你的Page.Header中有<% ... %>代码块(它指的是<head runat="server"> – 可能在母版页中)。 因此,当您尝试将某个项目添加到该控件的Controls集合时,您会在此问题的标题中收到错误消息。

如果我是对的,那么解决方法是在<% ... %>代码块周围包装<asp:placeholder runat="server">标签。 这使代码块成为占位符控件的子元素,而不是Page.Header控件的直接子Page.Header ,但它根本不会更改呈现的输出。 现在代码块不是Page.Header的直接子Page.Header您可以将其添加到标题的控件集合中,而不会出错。

再次,有一个代码块,或者你不会看到这个错误。 如果它不在你的aspx页面中,那么我首先看到的是由aspx顶部的MasterPageFile属性引用的文件。

以防万一,如果您正在使用Telerik组件,并且您的JavaScript中有<%= ….%>的引用,请使用RadScriptBlock包装您的脚本标记。

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

问候Örvar

查看“控件集合不能被修改,因为控件包含代码块”

在另一个问题上接受的解决scheme为我工作 – 更改<%=<%#实例,它将代码块从Response.Write转换为评估块,不受同样的限制。

在这种情况下,像这里所接受的解决scheme一样,您应该将控件添加到除主页ContentPlaceHolder元素之外的其他东西,即build议的asp:Placeholder控件。

我有同样的问题,我解决这个问题:

而不是将元添加到导致相同错误的当前页面标题,如下所示:

 Page.Header.Controls.Add(meta); 

我用这个来代替:

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

它就像一个魅力。

不是真的解决你的问题,但它是一个重要的select。

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

虽然该方法被称为“脚本”,但是可以添加任意string,包括html。

对于那些使用Televar的人来说,请确保你包装你的JavaScript

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

由于Telerik在查找元素时无法识别<%#%>,而且如果您的javascript代码未被包装,<%=%>会给您一个错误。

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