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

时间:2009-04-22 20:02:46

标签: c# asp.net user-controls

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

    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>

有什么问题?

22 个答案:

答案 0 :(得分:480)

首先,使用&lt;%#而不是&lt;%=:

启动代码块
<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代码块更改为数据绑定表达式 由于<%# ... %>数据绑定表达式不是代码块,因此CLR不会抱怨。然后在母版页的代码中添加以下内容:

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

答案 1 :(得分:243)

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

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

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

(我正在使用的CMS是从一些代码插入到头部区域,后者限制我添加带有元标记等各种信息的自定义控制块,所以这是它对我有用的唯一方式。)< / p>

答案 2 :(得分:52)

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

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

答案 3 :(得分:31)

将javascript放在div标签下。

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

它会工作!!

答案 4 :(得分:8)

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

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

答案 5 :(得分:5)

我在用户控件中遇到了同样的问题。我托管控件的页面在head标签中有注释,我删除了那些注释,之后一切正常。一些帖子还建议从头部删除脚本并将它们放在正文中。

答案 6 :(得分:4)

在我的情况下,我已将<%= %>替换为<%# %>,并且它有效!

答案 7 :(得分:4)

我尝试使用<%# %>但没有成功。然后我将我的代码中的Page.Header.DataBind();更改为this.Header.DataBind();,它运行正常。

答案 8 :(得分:2)

将javascript代码保留在body标记

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

答案 9 :(得分:2)

“&lt;%#”数据绑定技术不会直接在&lt; link&gt;内工作&lt; head&gt;中的标签标记:

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

答案 10 :(得分:2)

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

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

并且有效。

答案 11 :(得分:1)

另一种方法是让另一个.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";
}

答案 12 :(得分:1)

我在不同的情况下遇到了同样的问题 我在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";
}

答案 13 :(得分:1)

我的系统存在相同的问题,我从页面的上删除了JavaScript代码,并在关闭body标签之前将其放在了body

答案 14 :(得分:1)

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

解决方案1: 我把脚本标签保存在体内。

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

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

解决方案2:

我们也可以解决上述其中一个解决方案,例如将代码块替换为&lt;%#而不是&lt;%= 但问题是它只会提供相对路径< / strong>即可。如果你想要真正的绝对路径它将不起作用。

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

答案 15 :(得分:1)

我将<script>置于contentplaceholder内的<head>而不是将<script>置于所述contentplaceholder之内,从而解决了与此类似的错误<head>

答案 16 :(得分:1)

我遇到了同样的问题,但它与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,问题就解决了。

答案 17 :(得分:0)

在我的情况下,我收到此错误,因为我错误地将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>

答案 18 :(得分:0)

如果要从后面的代码添加动态控件,请删除包含服务器标签的部件并将其放在其他位置

我从页面的head部分删除了我的JavaScript并将其添加到页面正文并使其正常工作

答案 19 :(得分:0)

尝试在head标记之外编写java脚本代码,它肯定会起作用。当我将Java Script代码复制并粘贴到页面底部时,它就解决了。在之前,它在关闭表单标记之前就放入了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>

答案 20 :(得分:0)

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

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

答案 21 :(得分:-1)

标记<%= %>不适用于runat="server"的标记。将代码<%= %>移至runat="server"至其他代码(bodyhead,...),或从容器中移除runat="server"