“Koleksi Kontrol tidak dapat dimodifikasi karena kontrol berisi blok kode”

370

Saya mencoba membuat kontrol pengguna sederhana yang merupakan slider. Ketika saya menambahkan AjaxToolkit SliderExtender ke kontrol pengguna saya mendapatkan ini (* & $ # () @ # kesalahan:

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

Saya telah mencoba menempatkan placeholder di kontrol pengguna dan menambahkan textbox dan slider extender ke placeholder secara terprogram dan saya masih mendapatkan kesalahan.

Ini adalah kode sederhana:

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

Apa masalahnya?

Daniel P
sumber
11
Apa yang menyebabkan kesalahan ini bagi saya adalah menggunakan <% = Resolve (); %> fungsi di dalam tag <script> dan <link>. Saya akhirnya memperbaiki ini. Alih-alih menghapus kode yang menyinggung dalam tag kepala yang biasanya menyebabkan kesalahan ini. Cukup masukkan semua kode yang menyinggung dalam tag <asp: ContentPlaceHolder> </ asp: ContentPlaceHolder> tag.
Daniel P
stackoverflow.com/questions/4995274/... Berisi penjelasan yang lebih panjang untuk @Daniel Psaran tersebut.
lko

Jawaban:

498

Pertama, mulai blok kode dengan <% # bukannya <% =:

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

Ini mengubah blok kode dari blok kode Response.Write ke ekspresi penyatuan data.
Karena <%# ... %>penyatuan ekspresi bukan blok kode, CLR tidak akan mengeluh. Kemudian dalam kode untuk halaman master, Anda akan menambahkan yang berikut ini:

protected void Page_Load(object sender, EventArgs e)
{
  Page.Header.DataBind();    
}
Jalal El-Shaer
sumber
Saya tidak mendapatkan kesalahan ini, tetapi saya menggunakan notasi =. Namun: Saya telah melihat kode saya gagal dengan masalah yang dijelaskan di atas. Apa yang dapat menyebabkan hal itu (mengapa itu bekerja dengan saya)?
doekman
3
Saya sepertinya mulai mengalami masalah ini setelah beralih ke ASP.NET 4. Apakah diisolasi ke kerangka kerja baru?
Corgalore
3
Ini diselesaikan ketika saya menyalin dan menempelkan kode Java Script saya ke bagian bawah halaman. Di sebelumnya ditempatkan di tag HEAD.
Miank
1
Ini adalah bug yang aneh dengan .NET. Kenapa #bukannya =. Saya tidak akan pernah mengerti yang ini, sudah melakukannya selama bertahun-tahun tetapi berharap saya tahu MENGAPA!
Mark Pieszak - Trilon.io
1
Pahlawan tanpa jubah jika ada!
Julián
253

Saya hanya mengalami masalah ini juga tetapi menemukan solusi lain.

Saya menemukan bahwa membungkus blok kode dengan asp: PlaceHolder-tag memecahkan masalah.

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

(CMS yang saya gunakan memasukkan ke bagian-kepala dari beberapa kode di belakang yang membatasi saya untuk menambahkan blok kontrol khusus dengan berbagai informasi seperti meta-tag dll jadi ini adalah satu-satunya cara kerjanya bagi saya.)

Jonas Stensved
sumber
11
Luar biasa. Sebagai pengguna Telerik masa lalu yang mengontrol, saya sering menggunakan "RadCodeBlock" untuk tujuan yang sama, tetapi selalu terganggu oleh fakta bahwa saya tidak tahu apa-apa selain itu (atau seperti yang orang lain katakan, memindahkan kode ke tag dibuat untuk menjalankan sisi server). Saya tidak pernah tahu penampung ini dapat memiliki konten di dalamnya. Terima kasih!
JayC
1
Terima kasih sebenarnya kepada @JayC, RadCodeBlock adalah satu-satunya saran di halaman ini yang bekerja dengan kode yang saya warisi, karena berbagai alasan.
Shiser
Ini juga terjadi dengan kontrol DevExpress terdaftar. Saya memiliki dua aplikasi web dengan kode, konfigurasi, dan halaman master yang hampir identik. Hanya yang dengan DevExpress membutuhkan solusi seperti ini. Saya pikir itu ada hubungannya dengan HTTP handler mereka, majelis sumber daya atau sesuatu seperti itu mengacaukan pipa. Kami beralih dari perpustakaan pihak ketiga yang mendukung JQuery dan MVC yang memungkinkan Anda menghindari kode / penangan sisi server yang kompleks.
Tony Wall
Sebenarnya itu sudah cukup untuk membungkusnya dengan <div runat = "server"> <% = (...)%> </div>
Zbigniew Wiadro
5
@Teomanshipahi Sebenarnya cukup sederhana - menggunakan blok kode di dalam wadah berarti Anda tidak dapat lagi memperbarui Controlswadah itu. Ini pada dasarnya memanfaatkan perilaku ini dengan menempatkan blok kode dalam wadah terpisah - sehingga kesalahan hanya akan muncul jika Anda ingin memodifikasi Controlsdari PlaceHolder, daripada kontrol orangtua. PlaceHolderadalah pilihan yang bagus untuk ini, karena tidak memiliki kode sendiri (tidak seperti, katakan Panelatau <div runat="server">). Meskipun saya biasanya menggunakannya sebaliknya - taruh kontrol yang perlu saya modifikasi PlaceHolder.
Luaan
55

Saya dapat mengonfirmasi bahwa memindahkan javascript dengan <% %>tag dari kepala ke tag bentuk memperbaiki kesalahan ini

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

ITalez
sumber
1
Ya, baru saja dikonfirmasi, menghapus tag ASP <%%> dari head memperbaiki kesalahan ini.
Corgalore
+1, dikonfirmasi juga. Bagi saya, skrip yang bermasalah berada di luar elemen head dan form.
user420667
Dikonfirmasi Bekerja seperti pesona bagi saya. Hanya saja, jangan lupa untuk memeriksa skrip pada halaman master Anda karena ini adalah orang yang membuat saya kesulitan dan saya menghabiskan setengah jam sebelum mencari tahu bahwa itu bukan aspx saya: P
Luis Hernández
Ya ini bekerja untuk saya juga, tetapi mengapa? Apakah tag <HEAD> dalam file Master dimaksudkan untuk murni untuk file Master dan tidak ada file sub-aspx? Saya bertanya karena saya mencoba menjalankan kode JS di halaman sub-aspx yang berada di file master.
Fandango68
31

Tempatkan javascript di bawah tag div.

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

Itu akan berhasil !!

Anup
sumber
5
Atau lebih baik, gunakan pengganti sehingga tidak ada kode html tambahan yang dihasilkan.
Chris Haines
1
Ini berfungsi, meskipun Visual Studio mengatakan bahwa itu melanggar standar HTML5 untuk membuat <div> sarang dalam <head>.
Adi Inbar
IMHO, bukan solusi terbaik jika HTML5 tidak divalidasi, hindari div di headbagian.
PreguntonCojoneroCabrón
8

Anda dapat melakukan fungsi yang sama jika Anda menggunakan pengelola skrip di halaman Anda. Anda harus mendaftarkan skrip seperti ini

<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true"   EnablePageMethods="true">  
<Scripts>
      <asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" />
</Scripts>
</asp:ScriptManager>
Mohan Prajapati
sumber
ScriptManagertidak dapat menambahkan skrip di bagian kepala ?
Kiquenet
5

Saya memiliki masalah yang sama dalam kontrol pengguna. Halaman saya yang menjadi tuan rumah kontrol memiliki komentar di kepala tag, saya menghapus komentar itu, semuanya bekerja setelahnya. Beberapa posting juga menyarankan untuk menghapus skrip dari kepala dan menempatkannya di badan.


sumber
5

Saya mencoba menggunakan <%# %>tanpa hasil. Kemudian saya mengubah Page.Header.DataBind();kode saya di belakangthis.Header.DataBind(); dan bekerja dengan baik.

Nick
sumber
4

Dalam kasus saya, saya telah diganti <%= %>dengan <%# %>, dan itu berhasil!

Iori-kyo
sumber
3

Simpan kode skrip java di dalam tag tubuh

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

Teknik penyatuan data "<% #" tidak akan langsung berfungsi di dalam tag <link> dalam tag <head>:

<head runat="server">

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=<%# My.Constants.CSS_VERSION %>" />

</head>

Kode di atas akan dievaluasi menjadi

<head>

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=&lt;%# My.Constants.CSS_VERSION %>" />

</head>

Sebagai gantinya, Anda harus melakukan hal berikut (perhatikan dua tanda kutip ganda di dalam):

<head runat="server">

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=<%# "" + My.Constants.CSS_VERSION %>" />

</head>

Dan Anda akan mendapatkan hasil yang diinginkan:

<head>

  <link rel="stylesheet" type="text/css" href="css/style.css?v=1.5" />

</head>
perryv
sumber
2

Saya punya masalah ini, tetapi tidak melalui Header. Pengganti saya ada di tubuh. Jadi saya mengganti semua <%=dengan <%#dan melakukannya

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

dan itu berhasil.

bcr
sumber
1

Cara alternatif adalah memiliki halaman .aspx lain yang berfungsi sebagai halaman yang ingin Anda tautkan.

Beginilah tampilan header Masterpage:

<head runat="server">
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
    <link href="CSS/AccordionStyles.aspx" rel="stylesheet" type="text/css" />
</head>

Formulir .aspx yang dirujuk berisi konten Anda:

<%@ 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;
}

Terakhir, Anda memerlukan halaman .aspx untuk memberi tahu browser bahwa Anda mengirim konten CSS:

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

Saya juga menghadapi masalah yang sama. Saya menemukan solusinya seperti berikut.

Solusi 1: Saya menyimpan tag skrip saya di badan.

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

Sekarang konflik terkait tag akan diselesaikan.

Solusi 2:

Kita juga dapat memecahkan ini salah satu solusi di atas seperti Ganti blok kode dengan <% # bukannya <% = Tapi masalahnya adalah hanya akan memberikan jalur relatif . Jika Anda ingin benar- benar jalur absolut itu tidak akan berhasil.

Solusi 1 bekerja untuk saya. Berikutnya adalah pilihan Anda.

Mihir
sumber
1

Saya memiliki masalah yang sama, tetapi tidak ada hubungannya dengan JavaScript. Pertimbangkan kode ini:

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

Dalam situasi ini Anda akan mendapatkan kesalahan yang sama walaupun PlaceHolders tidak memiliki blok kode berbahaya, itu terjadi karena kontrol non-server hdnTest menggunakan blok kode.

Cukup tambahkan runat = server ke hdnTest dan masalahnya selesai.

pria putus asa
sumber
1

Saya memecahkan kesalahan yang mirip dengan ini dengan menempatkan bagian <script>dalam contentplaceholderdi dalam <head>daripada menempatkan bagian <script>luar kata contentplaceholderdi dalam<head>

Erickson Domingo
sumber
1

Saya memiliki masalah yang sama dengan keadaan yang berbeda.
Saya memiliki elemen sederhana di dalam tag tubuh.
Solusinya adalah:

<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";
}
Peter
sumber
1

Saya memiliki masalah yang sama dengan sistem saya, saya menghapus kode JavaScript dari halaman saya dan meletakkannya di badan sesaat sebelum menutup tag tubuh

Jesse Mwangi
sumber
0

Untuk beberapa kasus, ResolveUrl dan ResolveClientUrl berfungsi tetapi tidak setiap saat terutama dalam kasus file skrip js. Apa yang terjadi adalah itu berfungsi untuk beberapa halaman tetapi ketika Anda menavigasi ke beberapa halaman lain mungkin tidak berfungsi karena jalur relatif dari halaman tertentu.

Jadi akhirnya saran saya adalah selalu periksa kembali halaman situs Anda untuk mengetahui apakah semua referensi javascript Anda baik-baik saja atau tidak. Buka situs Anda di Google Chrome -> klik kanan pada halaman -> klik lihat halaman sumber -> HTML muncul -> sekarang klik hyperlink JS Anda; jika itu berfungsi dengan baik itu harus membuka file js di jendela browser lain, jika tidak maka tidak akan terbuka.

mhameed
sumber
0

Cobalah menulis kode skrip java Anda di luar tag kepala, itu pasti akan berfungsi. Itu diselesaikan ketika saya menyalin dan menempelkan kode Java Script saya ke bagian bawah halaman. Dalam sebelumnya ditempatkan di tag HEAD sekarang tepat sebelum menutup tag formulir.

    </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>
Miank
sumber
0

Hapus bagian yang memiliki tag server dan letakkan di tempat lain jika Anda ingin menambahkan kontrol dinamis dari kode di belakang

Saya menghapus JavaScript saya dari bagian kepala halaman dan menambahkannya ke badan halaman dan membuatnya berfungsi

pemenang
sumber
0

Dalam kasus saya, saya mendapatkan kesalahan ini karena saya salah mengatur InnerText ke div dengan html di dalamnya.

Contoh:

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>
cinta hidup
sumber
-1

Tag <%= %>tidak berfungsi menjadi tag dengan runat="server". Memindahkan kode Anda dengan <%= %>menjadi runat="server"ke tag lain ( body, head, ...), atau menghapus runat="server"dari wadah.

Eduardo Cuomo
sumber