web-dev-qa-db-ja.com

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

スライダーである簡単なユーザーコントロールを作成しようとしています。 AjaxToolkit SliderExtenderをユーザーコントロールに追加すると、次のようになります(*&$#()@#エラー)。

 '/'アプリケーションでサーバーエラーが発生しました。コントロールにコードブロック(つまり ``)が含まれているため、Controlsコレクションは変更できません。説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーと、コード内で発生したエラーの詳細については、スタックトレースを確認してください。
 
例外の詳細:System.Web.HttpException:コントロールにコードブロックが含まれているため、Controlsコレクションを変更できません(すなわち ``)。
 
ソースエラー:
 
現在のWeb要求の実行中に未処理の例外が発生しました。例外の発生源と場所に関する情報は、下記の例外スタックトレースを使用して識別できます。
 
スタックトレース:
 
 [HttpException(0x80004005):コントロールコントロールにコードブロック(つまり ``)が含まれているため、コレクションを変更できません。] System.Web.UI.ControlCollection.Add(Control child)+8677431 d:\ E\AjaxTk-AjaxControlToolkit内のAjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences(コントロールコントロール)\Release\AjaxControlToolkit\ExtenderBase\ScriptObjectBuilder.cs:293 AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs e)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 Sy stem.Web.UI.Control.LoadRecursive()
 +141 System.Web.UI.Control.LoadRecursive()
 +141 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint、Boolean) 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>

何が問題ですか?

359
Daniel P

最初に、<%=ではなく<%#でコードブロックを開始します。

<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();    
}
481
Jalal El-Shaer

私もこの問題に遭遇したばかりですが、別の解決策を見つけました。

コードブロックをasp:PlaceHolder-tagでラップすると問題が解決することがわかりました。

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

(私が使っているCMSは、メタタグなどのような様々な情報を持つカスタムコントロールブロックを追加することを私が制限していたいくつかのコードからヘッドセクションに挿入しています。

244
Jonas Stensved

<% %>タグ付きのjavascriptを先頭からformタグに移動するとこのエラーが修正されることを確認できます

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

52
ITalez

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

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

それはうまくいくでしょう!

31
Anup

ページでスクリプトマネージャを使用している場合も同じ機能を実行できます。このようにスクリプトを登録するだけです。

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

ユーザーコントロールにも同じ問題がありました。コントロールをホストしていた私のページのheadタグにコメントがありました。それらのコメントを削除しました。その後はすべてうまくいきました。いくつかの投稿では、頭からスクリプトを削除して本文に配置することも提案されています。

5
Shafeeq

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

4
Iori-kyo

私は<%# %>を使用しても成功しませんでした。それから私は後ろのコードのPage.Header.DataBind();this.Header.DataBind();に変更しました、そしてそれはうまくいきました。

4
Nick

Bodyタグ内にJavaスクリプトコードを保持します

<body> 
   <script type="text/javascript">
   </script>
</body>
2
Vikash pathak

"<%#"データバインド手法は、<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
perryv

私はこの問題を抱えていましたが、ヘッダ経由ではありませんでした。私のプレースホルダーは体の中にありました。だから私はすべての<%=<%#に置き換えて

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

そしてそれはうまくいった。

2
bcr

別の方法は、別の.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
Hugo

私は異なる状況で同じ問題を抱えていました。
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
Peter

私は自分のシステムで同じ問題を抱えていた、私は私のページからJavaScriptコードを削除し、bodyタグを閉じる直前にbodyにそれを置いた

1
Jesse Mwangi

私も同じ問題に直面しました。私は以下のような解決策を見つけました。

解決策1:スクリプトタグを本文に入れた。

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

今すぐタグに関する競合が解決されます。

解決策2:

コードブロックを<%=ではなく<%#に置き換えるなど、上記の解決策のいずれかを解決することもできます。ただし、問題はそれだけです。 相対パス。本当に絶対パスが欲しいのなら、それはうまくいきません。

解決策1は私のために働きます。次はあなたの選択です。

1
Mihir

<script><head>の内側のcontentplaceholderの外側に置くのではなく、<script><head>の内側のcontentplaceholderの内側に入れることで、これと同じようなエラーを解決しました。

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
desperate man

私の場合は、このエラーになりました。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>
0
live-love

コードビハインドから動的コントロールを追加する場合は、サーバータグがある部分を削除して別の場所に配置します。

JavaScriptをページのheadセクションから削除してページの本体に追加し、それを機能させました。

0
victor

あなたのJavaスクリプトコードをheadタグの外側に書いてみてください。確実に動作します。私の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
Miank

場合によってはResolveUrlとResolveClientUrlが動作しますが、特にjsスクリプトファイルの場合は常に動作しません。何が起こるかというと、それはいくつかのページではうまくいきますが、他のページに移動すると、その特定のページの相対パスのためにうまくいかないかもしれません。

だから最後に私の提案はあなたのサイトのページをすべて完全に再チェックしてあなたのすべてのjavascriptの参照が問題ないかどうかです。 Google Chromeでサイトを開く - >ページを右クリック - >ソースページの表示をクリック - > HTMLが表示 - > JSハイパーリンクをクリック正常に動作している場合は、別のブラウザウィンドウでjsファイルを開くはずです。それ以外の場合は開きません。

0
mdhameed