Programing

컨트롤에 코드 블록 (예 : <%… %>)이 포함되어 있으므로 컨트롤 컬렉션을 수정할 수 없습니다.

lottogame 2021. 1. 5. 07:39
반응형

컨트롤에 코드 블록 (예 : <%… %>)이 포함되어 있으므로 컨트롤 컬렉션을 수정할 수 없습니다.


C #에서 동적 메타 태그를 만들려고하는데 다음과 같은 오류가 발생합니다.

컨트롤에 코드 블록 (예 : <% ... %>)이 포함되어 있기 때문에 Controls 컬렉션을 수정할 수 없습니다.

이것은 내가 추가 한 코드입니다.

HtmlMeta meta = new HtmlMeta();
meta.Name = "keywords";
meta.Content = "book,paper";
Page.Header.Controls.Add(meta);

대단히 감사합니다.


세부 정보를 많이 포함하지 않았기 때문에 확실하게 말하기는 어렵지만, <% ... %>내부에 코드 블록 이 있다는 것입니다 Page.Header( <head runat="server">마스터 페이지에서 참조). 따라서 해당 컨트롤의 Controls 컬렉션에 항목을 추가하려고하면이 질문의 제목에 오류 메시지가 표시됩니다.

내가 맞다면 해결 방법은 코드 블록 <asp:placeholder runat="server">주위 태그 를 감싸는 것 <% ... %>입니다. 이렇게하면 코드 블록이 컨트롤의 직접적인 자식이 아닌 Placeholder 컨트롤의 자식이 Page.Header되지만 렌더링 된 출력은 전혀 변경되지 않습니다. 이제 코드 블록이 직접 자식이 아니므로 Page.Header헤더의 컨트롤 컬렉션에 오류없이 항목을 추가 할 수 있습니다.

다시 말하지만 어딘가에 코드 블록이 있거나이 오류가 표시되지 않습니다. aspx 페이지에 없으면 aspx MasterPageFile맨 위에 있는 속성이 참조하는 파일을 가장 먼저 볼 것입니다 .


Telerik 구성 요소를 사용하고 있고 자바 스크립트에 <% = .... %>가있는 참조가있는 경우를 대비하여 스크립트 태그를 RadScriptBlock으로 래핑하십시오.

 <telerik:RadScriptBlock ID="radSript1" runat="server">
   <script type="text/javascript">
        //Your javascript
   </script>
</telerik>

감사합니다 Örvar


"컨트롤에 코드 블록이 포함되어 있기 때문에 컨트롤 컬렉션을 수정할 수 없습니다" 에서 솔루션을 확인하십시오.

다른 문제에 허용 솔루션 변경 인스턴스의 - 나를 위해 일 <%=<%#에서 코드 블록을 변환, Response.Write동일한 제한에 의해 제한되지 않은 평가 블록에.

하지만이 경우 여기에 허용 된 솔루션이 제안 하는 것처럼 마스터 페이지 ContentPlaceHolder 요소가 아닌 다른 요소, 즉 asp:Placeholder제안 된 컨트롤에 컨트롤을 추가해야합니다 .


이 방법으로 해결 한 동일한 문제가 있습니다.

다음과 같이 동일한 오류를 일으킨 현재 페이지 헤더에 메타를 추가하는 대신 :

Page.Header.Controls.Add(meta);

대신 이것을 사용했습니다.

 Master.FindControl("YourHeadContentPlaceHolder").Controls.Add(meta);

그리고 그것은 매력처럼 작동합니다.


질문을 실제로 해결하지는 않지만 중요한 대안입니다.

페이지 시작 부분 ( <body>요소 내부 ) 에 사용자 정의 html을 추가 하려면 Page.ClientScript.RegisterClientScriptBlock().

이 메서드는 "스크립트"라고하지만 html을 포함하여 임의의 문자열을 추가 할 수 있습니다.


Ovar에서 언급 한 Telerik을 사용하는 경우 자바 스크립트를

 <telerik:RadScriptBlock ID="radSript1" runat="server">
   <script type="text/javascript">
        //Your javascript
   </script>
</telerik>

Telerik은 요소를 찾을 때 <% # %>를 인식하지 못하므로 자바 스크립트 코드가 래핑되지 않은 경우 <% = %>에서 오류가 발생합니다.


ContentPlaceholder 안에 자리 표시 자 컨트롤을 넣습니다.

<asp:Content ID="header" ContentPlaceHolderID="head" runat="server">
       <asp:PlaceHolder ID="metatags" runat="server">
        </asp:PlaceHolder>
</asp:Content>

비하인드 코드 :

HtmlMeta hm1 = new HtmlMeta();
hm1.Name = "Description";
hm1.Content = "Content here";
metatags.Controls.Add(hm1);

참조 URL : https://stackoverflow.com/questions/4995274/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blo

반응형