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





asp.net user-controls (18)


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

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

问题是什么?




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

<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();    
}



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




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

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

它的工作。







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

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



将java脚本代码保留在body标签内

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



将javascript放在div标签下。

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

它会工作!




我在不同的情况下遇到同样的问题。
我在身体标记里面有了简单的元素。
解决方案是:

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



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




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

解决方案1:我将脚本标记保留在正文中。

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

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

解决方案2:

我们也可以解决上述的一个解决方案,比如用<%#代替<%=替换代码块,但问题是它只会给出相对路径 。 如果你想要真正的绝对路径 ,它将无法工作。

解决方案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中即可解决问题。




尝试在头标之外编写您的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>



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

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




在我的情况下,我用<%# %>替换了<%= %> <%# %> ,它工作正常!




“<%#”数据绑定技术不会直接在<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,并将其添加到页面的主体中并使其工作




因此,解决此问题的另一种方法是,不要删除创建新字典的元素,只添加您不想删除的元素,然后用新字典替换原始字典。 我不认为这是一个效率问题太多,因为它不会增加迭代结构的次数。





c# asp.net user-controls