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