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

我正在尝试创build一个简单的用户控件,它是一个滑块。 当我添加一个AjaxToolkit SliderExtender到用户控件,我得到这个(*&$#()@#错误:

     “/”应用程序中的服务器错误。 控件集合不能被修改,因为控件包含代码块(即``)。 说明:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪,了解有关错误的更多信息以及源代码的来源。

    exception详细信息:System.Web.HttpException:控件集合不能被修改,因为控件包含代码块(即``)。

    源错误:

    在执行当前Web请求期间生成未处理的exception。 有关exception的来源和位置的信息可以使用下面的exception堆栈跟踪来标识。

    堆栈跟踪:

     [HttpException(0x80004005):控件集合无法修改,因为控件包含代码块(即``)。] System.Web.UI.ControlCollection.Add(Control child)+8677431 AjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences(Control control)in d:\ E \ AjaxTk-AjaxControlToolkit \ Release \ AjaxControlToolkit \ ExtenderBase \ ScriptObjectBuilder.cs:293在AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs e) System.Web.UI.Control.LoadRecursive()
     +50 System.Web.UI.Control.LoadRecursive()
     +141 System.Web.UI.Control.LoadRecursive()
     +141 System.Web.UI.Control.LoadRecursive()
     +141 System.Web.UI.Control.LoadRecursive()             
     +141 System.Web.UI.Control.LoadRecursive()
     +141 System.Web.UI.Control.LoadRecursive()
     +141 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+627


    版本信息:Microsoft .NET Framework版本:2.0.50727.3074;  ASP.NET版本:2.0.50727.3074

我已经尝试在用户控件中放置一个占位符,并以编程方式将占位符文本框和滑块扩展器添加到该位置,但仍然出现错误。

这里是简单的代码:

<table cellpadding="0" cellspacing="0" style="width:100%"> <tbody> <tr> <td></td> <td> <asp:Label ID="lblMaxValue" runat="server" Text="Maximum" CssClass="float_right" /> <asp:Label ID="lblMinValue" runat="server" Text="Minimum" /> </td> </tr> <tr> <td style="width:60%;"> <asp:CheckBox ID="chkOn" runat="server" /><asp:Label ID="lblPrefix" runat="server" />:&nbsp;<asp:Label ID="lblSliderValue" runat="server" />&nbsp;<asp:Label ID="lblSuffix" runat="server" /> </td> <td style="text-align:right;width:40%;"> <asp:TextBox ID="txtSlider" runat="server" Text="50" style="display:none;" /> <ajaxToolkit:SliderExtender ID="seSlider" runat="server" BehaviorID="seSlider" TargetControlID="txtSlider" BoundControlID="lblSliderValue" Orientation="Horizontal" EnableHandleAnimation="true" Length="200" Minimum="0" Maximum="100" Steps="1" /> </td> </tr> </tbody> </table> 

问题是什么?

首先,用<%#而不是<%=来启动代码块:

 <head id="head1" runat="server"> <title>My Page</title> <link href="css/common.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="<%# ResolveUrl("~/javascript/leesUtils.js") %>"></script> </head> 

这将代码块从Response.Write代码块更改为数据绑定expression式。
由于<%# ... %>数据绑定expression式不是代码块,所以CLR不会抱怨。 然后在母版页的代码中,添加以下内容:

 protected void Page_Load(object sender, EventArgs e) { Page.Header.DataBind(); } 

我也遇到了这个问题,但发现了另一个解决scheme。

我发现用asp:PlaceHolder-tag封装代码块可以解决这个问题。

 <asp:PlaceHolder runat="server"> <meta name="ROBOTS" content="<%= this.ViewData["RobotsMeta"] %>" /> </asp:PlaceHolder> 

(我使用的CMS是从后面的一些代码插入到头部分,从而限制了我添加自定义控制块与像元标签等各种信息,所以这是唯一的方法,它为我工作。

我可以确认,将<% %>标记从JavaScript头移动到窗体标记修复此错误

http://italez.wordpress.com/2010/06/22/ajaxcontroltoolkit-calendarextender-e-strana-eccezione/

将JavaScript放在一个div标签下。

 <div runat="server"> //div tag must have runat server //Your Jave script code goes here.... </div> 

它会工作!

如果您在页面中使用脚本pipe理器,则可以执行相同的function。 你必须像这样注册脚本

 <asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true" EnablePageMethods="true"> <Scripts> <asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" /> </Scripts> </asp:ScriptManager> 

我在用户控件中有同样的问题。 我的主页上的控件有标题的评论,我删除了这些评论,事后工作。 一些职位也build议从头部删除脚本,并将其放置在身体。

我尝试使用<%# %>没有成功。 然后我改变了Page.Header.DataBind(); 在我的代码后面this.Header.DataBind(); 它工作正常。

在我的情况下,我用<%# %>replace了<%= %> <%# %> ,它工作!

我有这个问题,但不是通过标题。 我的占位符在身体里。 所以我用<%#replace了所有的<%=并且做了

 protected void Page_Load(object sender, EventArgs e) { Page.Header.DataBind(); } 

它的工作。

另一种方法是让另一个.aspx页面充当您要链接到的页面。

这是主页面的标题:

 <head runat="server"> <asp:ContentPlaceHolder ID="head" runat="server"> </asp:ContentPlaceHolder> <link href="CSS/AccordionStyles.aspx" rel="stylesheet" type="text/css" /> </head> 

引用的.aspx表单包含您的内容:

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AccordionStyles.aspx.cs" Inherits="IntranetConnectCMS.CSS.AccordionStyles" %> .AccordionHeader { cursor: pointer; background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneHeaderClosed.png") %>); background-repeat: no-repeat; } .AccordionHeaderSelected { cursor: pointer; background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneHeaderOpen.png") %>); background-repeat: no-repeat; } .AccordionContent { background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneContent.png") %>); background-repeat: no-repeat; } 

最后,你需要.aspx页面告诉浏览器你正在发送CSS内容:

 protected void Page_Load(object sender, EventArgs e) { Response.ContentType = "text/css"; } 

我也面临同样的问题。 我发现如下的解决scheme。

解决scheme1:我保持我的脚本标签在身体。

 <body> <form> . . . . </form> <script type="text/javascript" src="<%= My.Working.Common.Util.GetSiteLocation()%>Scripts/Common.js"></script> </body> 

现在,关于标签的冲突将会解决。

解决scheme2:

我们也可以用上面的解决scheme之一解决这个问题,比如用<%#代替<%=replace代码块,但问题是只会给出相对path 。 如果你想要真正的绝对path ,它将无法正常工作。

解决scheme1适用于我。 接下来是你的select。

“<%#”数据绑定技术不会直接在<head>标签中的<link>标签内工作:

 <head runat="server"> <link rel="stylesheet" type="text/css" href="css/style.css?v=<%# My.Constants.CSS_VERSION %>" /> </head> 

上面的代码将评估

 <head> <link rel="stylesheet" type="text/css" href="css/style.css?v=&lt;%# My.Constants.CSS_VERSION %>" /> </head> 

相反,你应该做下面的事情(注意里面的两个双引号):

 <head runat="server"> <link rel="stylesheet" type="text/css" href="css/style.css?v=<%# "" + My.Constants.CSS_VERSION %>" /> </head> 

你会得到期望的结果:

 <head> <link rel="stylesheet" type="text/css" href="css/style.css?v=1.5" /> </head> 

我有同样的问题,但没有任何关于JavaScript的事情。 考虑这个代码:

 <input id="hdnTest" type="hidden" value='<%= hdnValue %>' /> <asp:PlaceHolder ID="phWrapper" runat="server"></asp:PlaceHolder> <asp:PlaceHolder ID="phContent" runat="server" Visible="false"> <b>test content</b> </asp:PlaceHolder> 

在这种情况下,即使PlaceHolders没有任何有害的代码块,也会得到相同的错误,这是因为非服务器控制hdnTest使用代码块。

只需将runat = server添加到hdnTest,问题就解决了。

将java脚本代码保存在body标签中

 <body> <script type="text/javascript"> </script> </body> 

我解决了类似的错误,把<script>放在<head> <script>里面的contentplaceholder里,而不是把<script>放在contentplaceholder之外的<head>

在某些情况下,ResolveUrl和ResolveClientUrl可以工作,但不是所有的时候,特别是在js脚本文件的情况下。 会发生什么事,它适用于某些页面,但是当您导航到其他页面时,由于该特定页面的相对path,可能无法正常工作。

所以最后我的build议是总是做一个完整的重新检查你的网站页面是否所有的JavaScript引用是否正常。 在Google Chrome中打开您的网站 – >右键点击页面 – >点击查看源页面 – > HTML出现 – >现在点击您的JS超链接; 如果工作正常,应该在另一个浏览器窗口中打开js文件,否则不会打开。

尝试编写您的Java脚本代docker标记之外肯定会工作。它解决了,当我复制并粘贴我的Java脚本代码到页面的底部。 在之前它被放置在HEAD标签现在就在closures表单标签之前。

  </div> <script> function validate() { try { var username = document.getElementById("<%=txtUserName.ClientID%>").value; var password = document.getElementById("<%=txtPWD.ClientID%>").value; if (username == "" && password == "") alert("Enter Username and Passowrd"); else { if (username == "") alert("Enter Username"); else if (password == "") alert("Enter Password"); } } catch (err) { } } </script> </form> 

如果要从后面的代码添加dynamic控件,请删除具有服务器标签的部分,并将其放在其他位置

我从页面的头部删除了我的JavaScript,并将其添加到页面的主体,并得到它的工作

在我的情况下,我得到了这个错误,因为我错误地将InnerText设置为一个与它里面的HTML div。

例:

 SuccessMessagesContainer.InnerText = ""; <div class="SuccessMessages ui-state-success" style="height: 25px; display: none;" id="SuccessMessagesContainer" runat="server"> <table> <tr> <td style="width: 80px; vertical-align: middle; height: 18px; text-align: center;"> <img src="<%=Image_success_icn %>" style="margin: 0 auto; height: 18px; width: 18px;" /> </td> <td id="SuccessMessage" style="vertical-align: middle;" class="SuccessMessage" runat="server" > </td> </tr> </table> </div> 

标签<%= %>不适用于runat="server"的标签。 将<%= %>代码移动到另一个标记( bodyhead ,…)的runat="server" ,或者从容器中移除runat="server"