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

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

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

这是我添加的代码:

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

非常感谢。

【问题讨论】:

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

标签: c#


【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 2013-05-25
          • 2012-01-02
          • 1970-01-01
          相关资源
          最近更新 更多