“控件集合不能被修改,因为控件包含代码块”
我正在尝试创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" />: <asp:Label ID="lblSliderValue" runat="server" /> <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=<%# 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"
的标签。 将<%= %>
代码移动到另一个标记( body
, head
,…)的runat="server"
,或者从容器中移除runat="server"
。