“Denetim kod blokları içerdiği için Denetimler koleksiyonu değiştirilemez”


370

Bir kaydırıcı olan basit bir kullanıcı denetimi oluşturmaya çalışıyorum. Kullanıcı denetimine AjaxToolkit SliderExtender eklediğimde bu (* & $ # () @ # hatası alıyorum:

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

Kullanıcı denetiminde bir yer tutucu koyarak denedim ve metin kutusu ve kaydırıcı genişletici yer tutucuya programlı olarak ekledim ve hala hata alıyorum.

İşte basit kod:

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

Sorun nedir?


11
Benim için bu hataya neden olan şey <% = Resolve (); %> <script> ve <link> etiketlerinin içindeki işlev. Sonunda bunu düzelttim. Genellikle bu hataya neden olan başlık etiketindeki rahatsız edici kodu kaldırmak yerine. Soruna neden olan tüm kodu bir <asp: ContentPlaceHolder> </ asp: ContentPlaceHolder> etiketine koymanız yeterlidir.
Daniel P

stackoverflow.com/questions/4995274/…@Daniel P Öneri için daha uzun bir açıklama içeriyor.
lko

Yanıtlar:


498

İlk olarak, kod bloğunu <% = yerine <% # ile başlatın:

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

Bu, kod bloğunu Response.Write kod bloğundan bir veri tabanı ifadesine değiştirir.
Yana <%# ... %>veri bağlama ifadeleri kod blokları değildir, CLR şikayetçi olmaz. Ardından ana sayfanın koduna aşağıdakileri eklersiniz:

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

Bu hatayı almıyorum, ancak = gösterim kullanıyorum. Ancak: Kodumu yukarıda açıklanan sorun ile başarısız gördüm. Buna neden olabilir (neden benimle iyi çalışıyor)?
doekman

3
ASP.NET 4'e geçtikten sonra bu sorunu yaşıyor gibi görünüyordu. Yeni çerçeveye izole mi?
Corgalore

3
Java Script kodumu sayfanın altına kopyalayıp yapıştırdığımda çözüldü. Öncekinde HEAD etiketine yerleştirilmişti.
Miank

1
Bu .NET ile tuhaf bir hata. Neden #yerine =. Bunu asla anlamayacağım, yıllardır yapıyorum ama NEDEN bilseydim!
Mark Pieszak - Trilon.io

1
Eğer varsa pelerinsiz kahramanlar!
Julián

253

Ben de bu problemle karşılaştım ama başka bir çözüm buldum.

Bir asp: PlaceHolder-tag ile kod blokları kaydırma sorunu çözdü bulundu.

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

(Kullandığım CMS, üst bölüme, arkasından meta-etiketler vb.Gibi çeşitli bilgilerle özel kontrol blokları eklememi engellediğinden, bu benim için çalışmanın tek yolu.


11
Muhteşem. Telerik kontrollerinin eski bir kullanıcısı olarak, sık sık aynı amaç için "RadCodeBlock" u kullanırdım, ama bunun dışında hiçbir şey bilmediğim gerçeği her zaman rahatsız olmuştu (ya da başkalarının belirttiği gibi, kodu bir etiketini sunucu tarafında çalıştırmak için yapılmıştır). Bu yer tutucuların içinde içerik olabileceğini hiç bilmiyordum. Teşekkür ederim!
JayC

1
@JayC'ye gerçekten teşekkür ederim, RadCodeBlock, bu sayfada çeşitli nedenlerle miras aldığım kodla çalışan tek öneriydi.
shiser

Bu, DevExpress denetimleri kaydedildiğinde de gerçekleşir. Neredeyse aynı kod, yapılandırma ve kalıp sayfaları olan iki web uygulamam var. Yalnızca DevExpress kullananların böyle bir geçici çözüm gerekir. Ben onların HTTP işleyicisi, kaynak derlemeleri veya boru hattı berbat gibi bir şey ile ilgili olduğunu düşünüyorum. Artık karmaşık sunucu tarafı kod / işleyicilerinden kaçınmanıza izin veren JQuery ve MVC lehine 3. parti kitaplıklarından uzaklaşıyoruz.
Tony Wall

Aslında <div runat = "server"> <% = (...)%> </div>
Zbigniew Wiadro

5
@Teomanshipahi Aslında oldukça basit - bir kabın içinde kod blokları kullanmak Controls, o kabı artık güncelleyemeyeceğiniz anlamına geliyor . Bu temelde koyarak bu davranışından yararlanan kod bloğunu ayrı bir kapta - Değiştirmek istiyorsa hata yalnızca göstermek diye Controlsbir PlaceHolderyerine ebeveyn kontrolü yerine,. PlaceHolderbunun için mükemmel bir seçimdir, çünkü kendi kodu yoktur (aksine, diyelim Panelya da <div runat="server">). Genellikle başka bir şekilde kullanmama rağmen - değiştirmem gereken kontrolleri koy PlaceHolder.
Luaan

55

Javascript'i <% %> etiketlerle kafadan form etiketine bu hatayı düzelttiğini

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


1
Evet, onaylandı, <%%> ASP etiketlerini kafadan kaldırmak bu hatayı düzeltir.
Corgalore

+1, onaylandı. Benim için sorunlu senaryo hem baş hem de form öğelerinin dışındaydı.
user420667

Onaylanmış. Benim için bir cazibe gibi çalışıyor. Ana sayfanızdaki komut dosyalarını kontrol etmeyi unutmayın, çünkü bu bana sorunlara neden olan kişiydi ve benim aspx olmadığını anlamaya başlamadan yarım saat kadar harcadım: P
Luis Hernández

Evet bu da benim için çalıştı, ama neden? Ana dosyadaki <HEAD> etiketi yalnızca Ana dosya içindir ve alt aspx dosyaları içermez mi? Ana dosyada bulunan bir alt aspx sayfasında JS kodu çalıştırmak çalışıyorum çünkü soruyorum.
fandango68

31

Javascript'i div etiketinin altına yerleştirin.

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

Çalışacak !!


5
Ya da daha iyisi, ekstra html kodu çıkmaması için bir yer tutucu kullanın.
Chris Haines

1
Visual Studio, <head> içinde bir <div> yuvalamak için HTML5 standardını ihlal ettiğini söylese de bu çalışır.
Adi Inbar

IMHO, HTML5 değil doğrular değilse en iyi çözüm, önlemek div içinde headbölüm.
PreguntonCojoneroCabrón

8

sayfanızda komut dosyası yöneticisi kullanıyorsanız aynı işlevi yapabilirsiniz. Senaryoyu böyle kaydetmelisin

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

ScriptManagerbaşlık bölümüne komut dosyası eklemiyor musunuz?
Kiquenet

5

Kullanıcı kontrolünde de aynı sorunu yaşadım. Denetimi barındıran sayfamın kafa etiketinde yorumlar vardı, bu yorumları kaldırdım, daha sonra her şey çalıştı. Bazı yayınlar ayrıca komut dosyalarının kafasından kaldırılmasını ve vücuda yerleştirilmesini önerir.


5

<%# %>Başarısız bir şekilde kullanmayı denedim . Sonra Page.Header.DataBind();kodumu arkasında değişti this.Header.DataBind();ve iyi çalıştı.


4

Benim durumumda, ben yerini almıştır <%= %>ile <%# %>ve işe yaradı!


3

Java komut dosyası kodunu gövde etiketinin içinde tutun

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

2

"<% #" Veri bağlama tekniği <head> etiketindeki <link> etiketlerinin içinde doğrudan çalışmaz:

<head runat="server">

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

</head>

Yukarıdaki kod,

<head>

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

</head>

Bunun yerine aşağıdakileri yapmalısınız (içerideki iki çift tırnak işaretine dikkat edin):

<head runat="server">

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

</head>

İstediğiniz sonucu elde edersiniz:

<head>

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

</head>

2

Bu sorunu yaşadım, ama Header aracılığıyla değil. Yer tutucum cesedin içindeydi. Bu yüzden tüm <%=ile değiştirdim <%#ve yaptım

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

ve işe yaradı.


1

Alternatif bir yol, bağlanmak istediğiniz sayfa olarak başka bir .aspx sayfasının çalışmasını sağlamaktır.

Ana sayfanın başlığı şuna benzer:

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

Başvurulan .aspx formu içeriğinizi içerir:

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

Son olarak, tarayıcıya CSS içeriği gönderdiğinizi bildirmek için .aspx sayfasına ihtiyacınız vardır:

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

1

Aynı sorunla da karşılaştım. Aşağıdaki gibi çözümler buldum.

Çözüm 1: Komut dosyası etiketimi gövdede sakladım.

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

Artık etiketlerle ilgili anlaşmazlıklar çözülecek.

Çözüm 2:

Kod bloğunu <% = yerine <% # ile değiştir gibi yukarıdaki çözümlerden birini de çözebiliriz. Ancak sorun yalnızca göreli yol vermesi . Gerçekten mutlak bir yol istiyorsanız işe yaramaz.

Çözüm 1 benim için çalışıyor. Sonraki seçim.


1

Aynı sorunu yaşadım, ancak JavaScript ile ilgisi yoktu. Bu kodu düşünün:

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

Bu durumda, PlaceHolders'ın zararlı kod blokları olmamasına rağmen aynı hatayı alırsınız, bunun nedeni sunucu olmayan kontrol hdnTest kod bloklarını kullanmasıdır.

Sadece hdnTest'e runat = server'ı ekleyin ve sorun çözüldü.


1

Ben koyarak buna benzer bir hata çözüldü <script>içeride a contentplaceholderiçeride <head>yerine koyarak <script>söz konusu dışında contentplaceholderiçeride<head>


1

Farklı koşullarla aynı sorunu yaşadım.
Vücut etiketinin içinde basit bir eleman vardı.
Çözüm şuydu:

<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

Sistemimde de aynı sorunu yaşadım, JavaScript kodunu sayfamdan kaldırdım ve gövde etiketini kapatmadan hemen önce vücuda koydum


0

Bazı durumlarda ResolveUrl ve ResolveClientUrl çalışır, ancak özellikle js komut dosyalarında her zaman çalışmaz. Ne olur, bazı sayfalar için çalışır, ancak diğer bazı sayfalara gittiğinizde, söz konusu sayfanın göreli yolu nedeniyle çalışmayabilir.

Son olarak benim önerim, tüm javascript referanslarınızın iyi olup olmadığı konusunda site sayfalarınızı her zaman tam olarak yeniden kontrol etmektir. Sitenizi Google Chrome'da açın -> sayfayı sağ tıklayın -> kaynak sayfasını görüntüle -> HTML görünür -> şimdi JS köprülerinizi tıklayın; eğer iyi çalışıyorsa, js dosyasını başka bir tarayıcı penceresinde açmalıdır, aksi takdirde açılmaz.


0

Java komut dosyası kodunuzu kesinlikle çalışacak olan baş etiketinin dışına yazmayı deneyin.Java Script kodumu sayfanın altına kopyalayıp yapıştırdığımda çözüldü. Öncekinde, form etiketini kapatmadan hemen önce HEAD etiketine yerleştirildi.

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

Sunucu etiketlerine sahip parçayı kaldırın ve arkasındaki koddan dinamik kontroller eklemek istiyorsanız başka bir yere yerleştirin

JavaScript’imi sayfanın baş bölümünden kaldırdım ve sayfanın gövdesine ekledim ve çalıştırdım


0

Benim durumumda yanlış InnerText içinde html ile bir div ayarlıyordu çünkü bu hatayı aldım.

Misal:

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

Etiketler <%= %>, ile bir etikette çalışmaz runat="server". Kodunuzu Taşı <%= %>içine runat="server"bir diğer etiketi (için body, head...) ya da kaldır runat="server"kabından.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.