"컨트롤에 코드 블록이 포함되어 있으므로 Controls 컬렉션을 수정할 수 없습니다"


370

슬라이더 인 간단한 사용자 정의 컨트롤을 만들려고합니다. 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>

무엇이 문제입니까?


11
이 오류의 원인은 <% = Resolve (); <script> 및 <link> 태그 내의 %> 기능. 나는 마침내 이것을 고쳤다. 일반적으로이 오류를 발생시키는 헤드 태그에서 문제가되는 코드를 제거하는 대신 모든 문제 코드를 <asp : ContentPlaceHolder> </ asp : ContentPlaceHolder> 태그에 넣으십시오.
Daniel P

stackoverflow.com/questions/4995274/…@Daniel P 제안에 대한 자세한 설명이 포함되어 있습니다 .
lko

답변:


498

먼저 <% = 대신 <% #로 코드 블록을 시작하십시오.

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

이 오류는 발생하지 않지만 = 표기법을 사용하고 있습니다. 그러나 위의 문제로 코드가 실패하는 것을 보았습니다. 그 원인은 무엇입니까 (왜 나에게 문제가 없는지)?
doekman 2016 년

3
ASP.NET 4로 전환 한 후이 문제가 발생하기 시작한 것 같습니다. 새 프레임 워크와 격리되어 있습니까?
Corgalore

3
Java Script 코드를 복사하여 페이지 하단에 붙여 넣을 때 해결됩니다. 이전에는 HEAD 태그에 배치되었습니다.
Miank

1
이것은 .NET과 같은 기괴한 버그입니다. 왜 #대신에 =. 나는 이것을 이해하지 못할 것이고, 수년간 그것을 해왔지만 왜 내가 알고 있었으면 좋겠다!
Mark Pieszak-Trilon.io

1
존재하지 않는 망토가없는 영웅!
Julián

253

방금이 문제에 부딪 쳤지 만 다른 해결책을 찾았습니다.

asp : PlaceHolder-tag로 코드 블록을 래핑하면 문제가 해결됩니다.

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

(내가 사용하는 CMS는 일부 코드에서 헤드 섹션에 삽입되어 메타 태그 등과 같은 다양한 정보가 포함 된 사용자 정의 제어 블록을 추가 할 수 없도록 제한했기 때문에 이것이 나를 위해 작동하는 유일한 방법입니다.)


11
대박. Telerik 컨트롤의 과거 사용자로서, 나는 종종 동일한 목적으로 "RadCodeBlock"을 사용했지만 항상 그 외에는 아무것도 몰랐습니다 (또는 다른 사람들이 언급했듯이 코드를 서버 측을 실행하기 위해 만들어진 태그). 이 자리 표시자가 그 안에 내용을 담을 수 있다는 것을 결코 알지 못했습니다. 감사합니다!
JayC

1
실제로 @JayC에 감사드립니다. RadCodeBlock은이 페이지에서 여러 가지 이유로 상속 한 코드로 작동하는 유일한 제안이었습니다.
shiser

이것은 DevExpress 컨트롤이 등록 된 경우에도 발생합니다. 거의 동일한 코드, 구성 및 마스터 페이지를 가진 두 개의 웹 응용 프로그램이 있습니다. DevExpress를 가진 사람 만이 이와 같은 해결 방법이 필요합니다. HTTP 처리기, 리소스 어셈블리 또는 파이프 라인을 엉망으로 만드는 것과 관련이 있다고 생각합니다. 복잡한 서버 측 코드 / 핸들러를 피할 수있는 JQuery 및 MVC를 선호하는 타사 라이브러리에서 멀어졌습니다.
Tony Wall

실제로 <div runat = "server"> <% = (...) %> </ div>로 감싸는 것으로 충분합니다.
Zbigniew Wiadro

5
@Teomanshipahi 실제로 매우 간단합니다. 컨테이너 내부에 코드 블록을 사용하면 컨테이너를 더 이상 업데이트 할 수 없습니다 Controls. 이것은 기본적으로 삽입하여이 동작을 악용하는 코드 블록을 별도의 용기를 - 수정하기를 원한다면 오류 만 표시 할 수 있도록 ControlsPlaceHolder오히려 부모 컨트롤보다. PlaceHolder자체 코드가 없기 때문에 ( Panel또는 말과 달리)이를위한 훌륭한 선택입니다 <div runat="server">. 일반적으로 다른 방법으로 사용하지만 수정해야 할 컨트롤을 넣습니다 PlaceHolder.
Luaan

55

<% %>태그가 있는 자바 스크립트를 헤드에서 양식 태그로 이동하면이 오류가 해결 된다는 것을 확인할 수 있습니다

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


1
예, 방금 확인했습니다. 헤드에서 <% %> ASP 태그를 제거하면이 오류가 해결됩니다.
Corgalore

+1도 확인되었습니다. 문제가있는 스크립트가 head 및 form 요소 외부에 있었지만 나에게있어.
user420667

확인했습니다. 나를 위해 매력처럼 작동합니다. 마스터 페이지에서 스크립트를 확인하는 것을 잊지 마십시오.이 문제가 발생한 스크립트이므로 내 aspx가 아니라는 것을 알기 전에 반 시간을 보냈습니다 .P
Luis Hernández

예, 이것이 저에게도 효과가 있었지만 그 이유는 무엇입니까? 마스터 파일의 <HEAD> 태그는 순수하게 마스터 파일을위한 것이며 하위 aspx 파일을 의미하지 않습니까? 마스터 파일에있는 하위 aspx 페이지에서 JS 코드를 실행하려고하기 때문에 묻습니다.
판당고 68

31

자바 스크립트를 div 태그 아래에 놓습니다.

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

작동합니다 !!


5
또는 자리 표시자를 사용하여 추가 HTML 코드가 출력되지 않도록하십시오.
Chris Haines

1
Visual Studio에서는 HTML5 표준을 위반하여 <head> 내에 <div>를 중첩한다고 말합니다.
Adi Inbar

HTML5가 유효하지 않은 경우 IMHO는 최상의 솔루션이 아니며 섹션의 div 를 피 head하십시오.
PreguntonCojoneroCabrón

8

페이지에서 스크립트 관리자를 사용하는 경우 동일한 기능을 수행 할 수 있습니다. 다음과 같이 스크립트를 등록해야합니다.

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

ScriptManager헤드 섹션 에 스크립트를 추가하지 않습니까?
Kiquenet

5

사용자 컨트롤에서 동일한 문제가 발생했습니다. 컨트롤을 호스팅하는 내 페이지에는 헤드 태그에 주석이 있었고 그 주석을 제거했습니다. 모든 것이 나중에 작동했습니다. 일부 게시물은 스크립트를 헤드에서 제거하여 본문에 배치 할 것을 제안합니다.


5

나는 <%# %>성공하지 않고 사용해 보았습니다 . 그런 다음 Page.Header.DataBind();코드를 변경 하고 this.Header.DataBind();정상적으로 작동했습니다.



3

본문 태그 안에 자바 스크립트 코드를 유지

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

2

"<% #"데이터 바인딩 기술은 <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>

2

나는이 문제가 있었지만 헤더를 통해서는 아니었다. 내 자리 표시자는 본문에있었습니다. 그래서 나는 모든 교체 <%=<%#와했다

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

그리고 효과가있었습니다.


1

다른 방법은 다른 .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;
}

마지막으로 브라우저에 CSS 내용을 전송하도록하려면 .aspx 페이지가 필요합니다.

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "text/css";
}

1

나는 또한 같은 문제에 직면했다. 다음과 같은 해결책을 찾았습니다.

해결 방법 1 : 스크립트 태그를 본문에 보관했습니다.

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

이제 태그와 관련된 충돌이 해결됩니다.

해결책 2 :

코드 블록을 <% = 대신 <% #로 바꾸기 와 같은 위의 솔루션 중 하나를 해결할 수도 있지만 문제는 상대 경로 만 제공한다는 것 입니다. 정말 절대 경로 를 원한다면 작동하지 않습니다.

솔루션 1이 저에게 효과적입니다. 다음은 당신의 선택입니다.


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가 코드 블록을 사용하기 때문에 동일한 오류가 발생합니다.

hdnTest에 runat = server를 추가하면 문제가 해결됩니다.


1

나는 퍼팅하여이 같은 오류를 해결 <script>안에 a를 contentplaceholder내부 <head>대신 퍼팅 <script>(가) 말했다 외부에서 contentplaceholder내부를<head>


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

1

내 시스템에서 동일한 문제가 발생하여 페이지에서 JavaScript 코드를 제거하여 body 태그를 닫기 직전에 본문에 넣었습니다.


0

경우에 따라 ResolveUrl 및 ResolveClientUrl이 작동하지만 특히 js 스크립트 파일의 경우 항상 작동하지는 않습니다. 어떤 페이지에서는 작동하지만 다른 페이지로 이동하면 특정 페이지의 상대 경로로 인해 작동하지 않을 수 있습니다.

마지막으로 제 제안은 모든 자바 스크립트 참조가 올바른지 여부에 대해 항상 사이트 페이지를 완전히 다시 확인하는 것입니다. Chrome에서 사이트를 열고-> 페이지를 마우스 오른쪽 버튼으로 클릭하고-> 소스 페이지보기를 클릭하십시오.-> HTML이 나타납니다. 이제 JS 하이퍼 링크를 클릭하십시오. 제대로 작동하면 다른 브라우저 창에서 js 파일을 열어야합니다. 그렇지 않으면 열리지 않습니다.


0

헤드 태그 외부에 자바 스크립트 코드를 작성하면 확실히 작동합니다. 내 자바 스크립트 코드를 복사하여 페이지 하단에 붙여 넣을 때 해결됩니다. 이전에는 양식 태그를 닫기 직전에 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>

0

서버 태그가있는 부분을 제거하고 코드 뒤에서 동적 컨트롤을 추가하려는 경우 다른 곳에 배치하십시오.

페이지의 헤드 섹션에서 JavaScript를 제거하고 페이지 본문에 추가하여 작동시킵니다.


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>

-1

태그 <%= %>는와 함께 태그에서 작동하지 않습니다 runat="server". 당신의 코드를 이동 <%= %>runat="server"타 태그 (에 body, head...), 또는 제거 runat="server"컨테이너.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.