“控件集合无法修改,因为控件包含代码块”;

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

Server Error in '/' Application. The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`). Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.


Exception Details: System.Web.HttpException: The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`).


Source Error:


An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.


Stack Trace:


[HttpException (0x80004005): The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`).]    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) in d:\E\AjaxTk-AjaxControlToolkit\Release\AjaxControlToolkit\ExtenderBase\ExtenderControlBase.cs:306 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(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627




Version Information: Microsoft .NET Framework Version:2.0.50727.3074; ASP.NET Version: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>

有什么问题吗?

435359 次浏览

我在用户控件中也有同样的问题。我的页面,托管控件有评论在头部标签,我删除了那些评论,一切工作之后。一些帖子还建议将脚本从头部移到正文中。

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

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

更改响应的代码块。将代码块写入数据绑定表达式 因为<%# ... %>数据绑定表达式不是代码块,所以CLR不会抱怨。然后在母版页的代码中,添加以下内容:

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

我尝试使用<%# %>没有成功。然后我把后面代码中的Page.Header.DataBind();改为this.Header.DataBind();,它工作得很好。

我可以确认,将带有<% %>标记的javascript从头部移动到表单标记可以修复此错误

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

你可以做同样的功能,如果你在你的页面使用脚本管理器。 你只需要像这样注册脚本

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

将JavaScript放在div标签下。

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

它会工作! !

我也遇到了这个问题,但我找到了另一个解决方案。

我发现用asp: placeholder标记包装代码块可以解决这个问题。

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

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

在我的例子中,我已经用<%# %>替换了<%= %>,并且它工作了!

另一种方法是使用另一个.aspx页面作为您想要链接的页面。

这是Masterpage的页眉的样子:

<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";
}

在某些情况下,ResolveUrl和ResolveClientUrl可以工作,但不是所有时候,特别是在js脚本文件的情况下。发生的事情是,它工作的一些页面,但当你导航到其他一些页面,它可能不会工作,由于该特定页面的相对路径。

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

我也遇到过同样的问题,但这与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>

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

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

我也面临着同样的问题。我找到了如下的解决方案。

<强>解决方案1: 我将script标签保留在body中

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

现在关于标签的冲突将得到解决。

解决方案2:

我们也可以像将代码块替换为<%#而不是<%=这样解决上述解决方案之一,但问题是它只会给出相对路径。如果你真的想要绝对路径,它不会工作。

解决方案1适合我。接下来是你的选择。

“<%#”数据绑定技术不会直接在<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>

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

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

标记<%= %>不能与runat="server"组成一个标记。将带有<%= %>的代码移动到runat="server"到另一个标记(bodyhead,…),或从容器中删除runat="server"

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

试着写你的java脚本代码以外的头标签,它肯定会工作。当我复制并粘贴我的Java脚本代码到页面底部时,它就解决了。在以前它放在HEAD标签,现在只是在关闭表单标签之前。

    </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>

如果您想从后面的代码中添加动态控件,则删除具有服务器标记的部分并将其放置在其他地方

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

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

例子:

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>

我有这个问题,但不是通过头。我的占位符在身体里。所以我用<%#替换了所有的<%=

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

这招奏效了。

我在不同的情况下有同样的问题 我在body标签中有一个简单的元素 解决方案是:

<asp:PlaceHolder ID="container" runat="server">
<a id="child" href="<%# variable %>">Change me</a>
</asp:PlaceHolder>
protected new void Page_Load(object sender, EventArgs e)
{
Page.Form.DataBind(); // I neded to Call DataBind on Form not on Header
container.InnerHtml = "Simple text";
}

我的系统也有同样的问题,我从我的页面中删除了JavaScript代码,并在关闭身体标签之前将其放在身体上