我试图创建一个简单的用户控件,这是一个滑块。当我添加一个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>

有什么问题吗?


当前回答

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

最后,我的建议是,对你的网站页面做一次全面的复查,看看你的javascript引用是否正确。 在谷歌Chrome浏览器中打开您的网站->页面右键单击->点击查看源页面-> HTML出现->现在点击您的JS超链接;如果它的工作正常,它应该打开js文件在另一个浏览器窗口,否则它不会打开。

其他回答

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

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

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

这招奏效了。

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

首先,用<%#开始代码块,而不是<%=:

<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();它运行得很好。