【问题标题】:The Controls collection cannot be modified because the control contains code blocks无法修改 Controls 集合,因为该控件包含代码块
【发布时间】:2011-11-21 12:31:34
【问题描述】:

这与所有其他问题有点不同,因为它们似乎都专门针对头部内容。有了这个,我有一个带有以下占位符的用户控件:

<asp:PlaceHolder runat="server" ID="DiscussIncludes">    
    <script>
        var OnLastPage = <asp:Literal runat="server" ID="OnLastPageJS" />;
        var AJAXWait = false;
        var MinChars = <%=Settings.MinimumCommentChars%>;
        var AJAXURL = "<%=ResolveClientUrl("~/Handlers/DiscussAjaxHandler.ashx")%>";
        var CurrUsername = "<%=ThisUser.Username %>";
        var GravHash = "<asp:Literal runat="server" ID="GravJSRef" />";
        var RelURL = "<%=ResolveClientUrl("~/users/")%>";
        var Anch = "<%=Anchor.ToString()%>";
        var MyRep = "<%=MyRepString%>";
        var CurrReportID = 0;
        var LastPageURL = "<asp:Literal runat="server" ID="JSLastPageURL" />";
        var AllowedChars = <%=Settings.MaxCommentChars %>;
    </script>
    <script src="<%=CommonFunctions.AllocateStaticPath("/js/Discuss.js?v=" + Settings.JSVersionID)%>"></script>
    <script src="<%=CommonFunctions.AllocateStaticPath("/js/BlockUI.js?v=" + Settings.JSVersionID)%>"></script> 
</asp:PlaceHolder>

在我后面的代码中:

ContentPlaceHolder FooterControl = (ContentPlaceHolder)Page.Master.FindControl("JavascriptIncludes");
FooterControl.Controls.Add(DiscussIncludes);

这会引发错误:

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

FooterControl.Controls.Add(DiscussIncludes); 线上。我尝试将占位符内的所有&lt;%= 更改为&lt;%#,但没有运气。

需要注意的一点是,此控件在我的所有其他页面上都可以正常工作。有什么想法会导致这种情况吗?

【问题讨论】:

  • 您是否使用&lt;%# 表达式致电FooterControl.DataBind()
  • @Yuriy,是的,它抛出了同样的错误:(

标签: c# asp.net .net user-controls


【解决方案1】:

此控件中的任何内容都不会导致问题 - 如果它发生在您将控件添加到特定环境并且仅指向问题的那个环境时。投诉页面发生了什么?

【讨论】:

  • 在抛出错误的页面上我有一个&lt;asp:Content ContentPlaceHolderID="JavascriptIncludes" runat="server"&gt;,它正在将内容添加到同一位置,可能是这样吗?
【解决方案2】:

我在我的系统上尝试了以下操作,它似乎正在工作......

<asp:PlaceHolder runat="server" ID="DiscussIncludes">    
    <script type="text/javascript">
        var path = <%=Common.path%>;
    </script>
    <script type="text/javascript" src='<%=Common.GetScriptPath("jquery-1.4.1-vsdoc.js")%>'></script>
    <asp:PlaceHolder runat="server" ID="JsIncludes"> 
    </asp:PlaceHolder>
</asp:PlaceHolder>

关于后面的代码..

    LiteralControl include = new LiteralControl(string.Format("<script src='{0}'></script>", Common.GetScriptPath("jquery-1.4.1.min.js")));
JsIncludes.Controls.Add(include);

如果我尝试将控件添加到 DiscussIncludes,则会出现异常。但是,如果将控件添加到 JsIncludes 它可以工作。 JsIncludes 控件是 DiscussIncludes 的子占位符。

【讨论】:

  • 我在我的系统上尝试过,它确实有效。请查看我的更新回复。
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多