「コントロールにコードブロックが含まれているため、コントロールコレクションを変更できません」


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>タグに挿入するだけです。
ダニエル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

3
ASP.NET 4に切り替えた後、この問題が発生し始めたようです。新しいフレームワークに隔離されていますか?
Corgalore 2011年

3
Javaスクリプトコードをコピーしてページの下部に貼り付けると解決します。以前はHEADタグに配置されていました。
Miank、2014

1
これは、.NETのこのような奇妙なバグです。なぜの#代わりに=。私はこれを理解することは決してなく、何年もそれをやっていますが、なぜ私が知っていることを願っています!
Mark Pieszak-Trilon.io 2016年

1
存在する場合、ケープなしのヒーロー!
フリアン

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は、さまざまな理由で、私が継承したコードを処理するこのページでの唯一の提案でした。
2012年

これは、登録されたDevExpressコントロールでも発生します。ほぼ同じコードの2つのWebアプリケーション、構成ページとマスターページがあります。このような回避策が必要なのは、DevExpressを備えたものだけです。それは、HTTPハンドラー、リソースアセンブリ、またはパイプラインをめちゃくちゃにするようなものと関係があると思います。サードパーティのライブラリから離れ、JQueryとMVCに移行しました。これにより、複雑なサーバー側のコード/ハンドラーを回避できます。
Tony Wall

実際、<div runat = "server"> <%=(...)%> </ div>でラップするだけで十分です
Zbigniew Wiadro

5
@Teomanshipahiそれは実際には非常に単純です-コンテナー内でコードブロックを使用するとControls、そのコンテナーを更新できなくなります。これは基本的に置くことによって、この動作を悪用コードブロックを別の容器に-ので、あなたが変更したい場合は、エラーにのみ現れるだろうControlsPlaceHolder、むしろ親コントロールよりも。PlaceHolder独自のコードがないため(Panelやとは異なり)、これは最適な選択肢です<div runat="server">。通常は逆に使用しますが、変更が必要なコントロールを配置しますPlaceHolder
Luaan

55

<% %>タグ付きのJavaScriptをヘッドからフォームタグに移動すると、このエラーが修正されることを確認できます

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


1
はい、確認しました。ASPタグ<%%>をヘッドから削除すると、このエラーが修正されます。
Corgalore 2011年

+1、確認済み。私にとっては、問題のあるスクリプトは、head要素とform要素の両方の外側にありました。
user420667

確認しました。私にとっては魅力のように機能します。ただ、これは私がトラブル原因だったものだったので、自分のマスターページにスクリプトをチェックすることを忘れて、私はそれが私のaspxなかったことを考え出す30分前のように過ごしていない:P
ルイス・エルナンデス

はい、これは私にとってもうまくいきましたが、なぜですか?マスターファイルの<HEAD>タグは、純粋にマスターファイル用であり、サブASPXファイル用ではないのですか?マスターファイルにあるサブASPXページでJSコードを実行しようとしているので、質問します。
Fandango68

31

JavaScriptをdivタグの下に配置します。

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

うまくいくよ!


5
または、プレースホルダーを使用して、追加のHTMLコードが出力されないようにします。
Chris Haines 2013

1
これは機能しますが、Visual Studioは、<div>を<head>内にネストすることはHTML5標準に違反すると述べています。
Adi Inbar

IMHO、HTML5が検証されない場合の最善の解決策ではないため、セクションの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();それはうまくいきました。


4

私の場合、に置き換えました<%= %><%# %>、うまくいきました!



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>

代わりに、以下を実行する必要があります(内部の2つの二重引用符に注意してください)。

<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がうまくいきます。次はあなたの選択です。


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がコードブロックを使用しているために発生します。

runn = serverをhdnTestに追加するだけで問題は解決します。


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タグを閉じる直前にbodyに配置しました


0

ResolveUrlおよびResolveClientUrlが機能する場合もありますが、特にjsスクリプトファイルの場合は、常に機能するとは限りません。何が起きるかは、一部のページでは機能しますが、他のページに移動すると、その特定のページの相対パスが原因で機能しない場合があります。

最後に、私の提案は、すべてのJavaScript参照が適切かどうかについて、常にサイトページを完全に再確認することです。Google Chromeでサイトを開きます->ページを右クリックします-> [ソースページを表示]をクリックします-> HTMLが表示されます-> JSハイパーリンクをクリックします。正常に機能している場合は、jsファイルを別のブラウザーウィンドウで開く必要があります。それ以外の場合は開きません。


0

headタグの外側に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>

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"他のタグ(とbodyhead、...)、または削除runat="server"コンテナから。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.