Programing

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

lottogame 2020. 2. 28. 18:35
반응형

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


슬라이더 인 간단한 사용자 정의 컨트롤을 만들려고합니다. AjaxToolkit SliderExtender를 사용자 정의 컨트롤에 추가하면 (* & $ # () @ # 오류가 발생합니다.

    '/'응용 프로그램에 서버 오류가 있습니다. 컨트롤에 코드 블록 (예 :``)이 포함되어 있으므로 Controls 컬렉션을 수정할 수 없습니다. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 발생한 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

    예외 정보 : System.Web.HttpException : 컨트롤에 코드 블록 (예 :``)이 포함되어 있으므로 Controls 컬렉션을 수정할 수 없습니다.

    소스 오류 :

    현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 예외의 출처와 위치에 관한 정보는 아래 예외 스택 추적을 사용하여 식별 할 수 있습니다.

    스택 추적 :

    [HttpException (0x80004005) : 컨트롤에 코드 블록 (예 :``)이 포함되어 있으므로 Controls 컬렉션을 수정할 수 없습니다.] System.Web.UI.ControlCollection.Add (Control child) +8677431 AjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences (Control control) d : \ E \ AjaxTk-AjaxControlToolkit \ Release \ AjaxControlToolkit \ ExtenderBase \ ScriptObjectBuilder.cs : 293 d : \ E \ AjaxTk-AjaxControlToolkit \ Release \ AjaxControlToolExtender : Extender의 ExtenderBase \ ScriptObjectBuilder.cs : 293 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 (부울 includeStagesBeforeAsyncPoint, 부울 includeStagesAfterAsyncPoint) +627


    버전 정보 : Microsoft .NET Framework 버전 : 2.0.50727.3074; ASP.NET 버전 : 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();    
}

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

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

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

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


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

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


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

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

작동합니다 !!


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

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

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


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


내 경우에는으로 교체 <%= %>되었으며 <%# %>작동했습니다!


body 태그 안에 자바 스크립트 코드를 유지하십시오

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

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

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

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

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


다른 방법은 다른 .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 : 스크립트 태그를 본문에 보관했습니다.

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

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


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


다른 상황에서도 같은 문제가있었습니다.
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 코드를 제거하여 body 태그를 닫기 직전에 본문에 넣었습니다.


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

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


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

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

참고 URL : https://stackoverflow.com/questions/778952/the-controls-collection-cannot-be-modified-because-the-control-contains-code-bl



반응형