"नियंत्रण संग्रह को संशोधित नहीं किया जा सकता क्योंकि नियंत्रण में कोड ब्लॉक होते हैं"


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
जो मेरे लिए यह त्रुटि पैदा कर रहा था वह <% = रिज़ॉल्यूशन () था; <स्क्रिप्ट> और <लिंक> टैग के अंदर%> कार्य। मैंने आखिरकार यह तय कर दिया। हेड टैग में अपमानजनक कोड को हटाने के बजाय जो आमतौर पर इस त्रुटि का कारण बनता है। सीधे शब्दों में सभी अपमानजनक कोड एक <asp: ContentPlaceHolder> </ asp: ContentPlaceHolder> टैग में डालें।
डैनियल पी

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 कोड ब्लॉक से एक databinding अभिव्यक्ति के लिए कोड ब्लॉक बदलता है।
चूंकि <%# ... %>डेटाबाइंडिंग एक्सप्रेशन कोड ब्लॉक नहीं हैं, इसलिए CLR शिकायत नहीं करेगा। फिर मास्टर पृष्ठ के लिए कोड में, आप निम्नलिखित जोड़ेंगे:

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

मुझे यह त्रुटि नहीं मिली, लेकिन मैं = नोटेशन का उपयोग कर रहा हूं। हालाँकि: मैंने ऊपर वर्णित समस्या के साथ अपना कोड विफल देखा है। क्या कारण हो सकते हैं (क्यों यह मेरे साथ ठीक काम कर रहा है)?
डॉकमैन

3
मैं ASP.NET पर स्विच करने के बाद इस समस्या को शुरू करने के लिए लग रहा था। यह नए ढांचे के लिए अलग है?
Corgalore

3
इसका हल तब होता है जब मैं अपने जावा स्क्रिप्ट कोड को पेज के नीचे कॉपी और पेस्ट करता हूं। पिछले में इसके टैग टैग में रखा गया था।
मियांक

1
यह .NET के साथ ऐसा विचित्र बग है। #इसके बजाय क्यों =? मैं इसे कभी नहीं समझ पाऊंगा, सालों से ऐसा कर रहा हूं लेकिन काश मुझे पता होता कि क्यों!
मार्क पिज़्ज़क - ट्रिलोन

1
यदि वे मौजूद हैं तो बिना टोपी के हीरो!
जूलियन

253

मैं बस इस समस्या में भाग गया, लेकिन एक और समाधान पाया।

मैंने पाया कि एस्प के साथ कोड ब्लॉक को लपेटना: प्लेसहोल्डर-टैग समस्या को हल करता है।

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

(मैं जिस CMS का उपयोग कर रहा हूं, वह कुछ कोड से हेड-सेक्शन में सम्मिलित हो रहा है जिसके पीछे मुझे कस्टम नियंत्रण ब्लॉकों को मेटा-टैग आदि जैसी विभिन्न जानकारी के साथ जोड़ने से प्रतिबंधित किया गया है, इसलिए यह एकमात्र तरीका है जो मेरे लिए काम करता है।)


11
बहुत बढ़िया। Telerik नियंत्रण के पिछले उपयोगकर्ता के रूप में, मैं अक्सर उनके "RadCodeBlock" का उपयोग एक ही उद्देश्य के लिए करता हूं, लेकिन हमेशा इस तथ्य से नाराज था कि मुझे इसके अलावा कुछ भी नहीं पता था (या जैसा कि दूसरों ने उल्लेख किया है, कोड को एक में स्थानांतरित करना। सर्वर-साइड चलाने के लिए बनाया गया टैग)। मुझे कभी नहीं पता था कि ये प्लेसहोल्डर उनके अंदर सामग्री रख सकते हैं। धन्यवाद!
JayC

1
वास्तव में @JayC को धन्यवाद, RadCodeBlock इस पेज पर एकमात्र सुझाव था जो विभिन्न कारणों से मुझे विरासत में मिले कोड के साथ काम करता था।
शिस्टर

यह भी पंजीकृत DevExpress नियंत्रण के साथ होता है। मेरे पास लगभग समान कोड, कॉन्फ़िगरेशन और मास्टर पृष्ठों के साथ दो वेब एप्लिकेशन हैं। केवल DevExpress वाले को इस तरह वर्कअराउंड की आवश्यकता होती है। मुझे लगता है कि उनके HTTP हैंडलर, रिसोर्स असेंबली या पाइपलाइन को गड़बड़ाने वाली चीज़ के साथ कुछ करना है। हम JQuery और MVC के पक्ष में अब 3 पार्टी पुस्तकालयों से दूर जा रहे हैं जो आपको जटिल सर्वर-साइड कोड / हैंडलर से बचने की अनुमति देता है।
टोनी वॉल

वास्तव में यह इसे <div runat = "server"> <% = (...)%> </ div>
Zbigniew Wiadro

5
@Teomanshipahi यह वास्तव में बहुत सरल है - एक कंटेनर के अंदर कोड ब्लॉक का उपयोग करने का मतलब है कि अब आप Controlsउस कंटेनर का अद्यतन नहीं कर सकते । यह मूल रूप से रख कर इस व्यवहार कारनामे कोड ब्लॉक एक अलग कंटेनर में - तो त्रुटि केवल दिखाई देंगे जब आपने संशोधित करने के लिए चाहता था होगा Controlsकी PlaceHolderनहीं बल्कि माता पिता नियंत्रण की तुलना में,। PlaceHolderइसके लिए एक बढ़िया विकल्प है, क्योंकि इसका अपना कोई कोड नहीं है (इसके विपरीत, कहें Panelया <div runat="server">)। हालाँकि मैं आमतौर पर इसका उपयोग दूसरे तरीके से करता हूं - उन नियंत्रणों को रखता हूं जिन्हें मुझे संशोधित करने की आवश्यकता होती है PlaceHolder
लुआं

55

मैं पुष्टि कर सकता हूं कि जावास्क्रिप्ट <% %>को सिर से टैग के रूप में स्थानांतरित करना इस त्रुटि को ठीक करता है

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


1
हां, बस पुष्टि की गई है, एएसपी टैग <%%> को सिर से हटाने से यह त्रुटि ठीक हो जाती है।
Corgalore

साथ ही पुष्टि की गई। मेरे लिए हालांकि समस्याग्रस्त लिपि सिर और रूप दोनों तत्वों के बाहर थी।
user420667

की पुष्टि। मेरे लिए एक आकर्षण की तरह काम करता है। बस अपने मास्टर पेज पर लिपियों की जांच करना न भूलें क्योंकि यह वही था जो मुझे परेशान कर रहा था और मैंने यह पता लगाने से पहले आधे घंटे का समय बिताया कि यह मेरा एस्पेक्स नहीं था: पी
लुइस हर्नांडेज़

हाँ यह मेरे लिए भी काम किया, लेकिन क्यों? क्या मास्टर फ़ाइल में <HEAD> टैग का मतलब विशुद्ध रूप से मास्टर फ़ाइल के लिए होना है और कोई उप-एस्पेक्स फाइल नहीं है? मैं पूछता हूं क्योंकि मैं जेएस कोड को एक उप-एस्पक्स पृष्ठ में चलाने की कोशिश कर रहा हूं जो मास्टर फ़ाइल में रहता है।
Fandango68

31

जावास्क्रिप्ट को एक div टैग के अंतर्गत रखें।

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

यह काम करेगा !!


5
या बेहतर, एक प्लेसहोल्डर का उपयोग करें ताकि कोई अतिरिक्त HTML कोड आउटपुट न हो।
क्रिस हैन्स

1
यह काम करता है, हालांकि विज़ुअल स्टूडियो का कहना है कि यह <head> के भीतर <div> को घोंसले के लिए HTML5 मानक का उल्लंघन करता है।
आदि इनबार

IMHO, सबसे अच्छा समाधान नहीं अगर HTML5 मान्य नहीं है, तो अनुभाग में div से बचें head
प्रीग्टनटनकोजेरो कैब्रोन

8

यदि आप अपने पृष्ठ में स्क्रिप्ट प्रबंधक का उपयोग कर रहे हैं, तो आप वही कार्यक्षमता कर सकते हैं। आपको बस स्क्रिप्ट को इस तरह रजिस्टर करना होगा

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

ScriptManagerहेड सेक्शन में स्क्रिप्ट न जोड़ें ?
कीनिकात

5

उपयोगकर्ता नियंत्रण में मेरे पास एक ही मुद्दा था। कंट्रोल को होस्ट करने वाले मेरे पेज पर हेड टैग में टिप्पणियां थीं, मैंने उन टिप्पणियों को हटा दिया, बाद में काम किया। कुछ पोस्ट स्क्रिप्ट को सिर से हटाने और उन्हें शरीर में रखने का भी सुझाव देते हैं।


5

मैंने प्रयोग करने की कोशिश की <%# %> बिना किसी सफलता के साथ । फिर मैं Page.Header.DataBind();अपने कोड में पीछे बदल गया this.Header.DataBind();और यह ठीक काम किया।


4

मेरे मामले में, मैं के <%= %>साथ बदल दिया है <%# %>, और यह काम किया!



2

"<% #" डेटाबाइंडिंग तकनीक सीधे <head> टैग में <लिंक> टैग के अंदर काम नहीं करेगी:

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

इसके बजाय, आपको निम्न कार्य करना चाहिए (दो दोहरे उद्धरणों पर ध्यान दें):

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

अंत में, आपको सीएसएस सामग्री भेजने वाले ब्राउज़र को बताने के लिए .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

मुझे भी यही समस्या थी, लेकिन इसका जावास्क्रिप्ट से कोई लेना-देना नहीं था। इस कोड पर विचार करें:

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

इस स्थिति में आपको एक ही त्रुटि मिलेगी भले ही प्लेसहोल्डर्स में कोई हानिकारक कोड ब्लॉक नहीं है, यह गैर-सर्वर नियंत्रण के कारण होता है hdnTest कोड ब्लॉक का उपयोग करता है।

बस रननेट = सर्वर को hdnTest में जोड़ें और समस्या हल हो गई है।


1

मैंने इसी तरह की एक त्रुटि को हल किया, ताकि बाहर की त्रुटि के <script>अंदर बाहर डालने के बजाय contentplaceholderअंदर को <head>डाल दिया जाए<script>contentplaceholder<head>


1

विभिन्न परिस्थितियों के साथ मेरा एक ही मुद्दा था।
मैं शरीर टैग के अंदर सरल तत्व था।
समाधान था:

<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

मेरे सिस्टम के साथ एक ही मुद्दा था, मैंने अपने पेज से जावास्क्रिप्ट कोड हटा दिया और बॉडी टैग बंद करने से ठीक पहले इसे शरीर पर डाल दिया


0

कुछ मामलों के लिए ResolveUrl और ResolveClientUrl काम करता है, लेकिन विशेष रूप से js स्क्रिप्ट फ़ाइलों के मामले में हर समय नहीं। क्या होता है यह कुछ पृष्ठों के लिए काम करता है लेकिन जब आप कुछ अन्य पृष्ठों पर जाते हैं तो यह उस विशेष पृष्ठ के सापेक्ष पथ के कारण काम नहीं कर सकता है।

तो आखिरकार मेरा सुझाव हमेशा आपकी साइट के पृष्ठों की पूरी जाँच करना है कि आपके सभी जावास्क्रिप्ट संदर्भ ठीक हैं या नहीं। Google Chrome में अपनी साइट खोलें -> पेज पर राइट क्लिक करें -> व्यू सोर्स पेज पर क्लिक करें -> HTML प्रकट होता है -> अब अपने जेएस हाइपरलिंक पर क्लिक करें; यदि इसका कार्य ठीक है तो इसे js फ़ाइल को किसी अन्य ब्राउज़र विंडो में खोलना चाहिए, अन्यथा यह नहीं खुलेगी।


0

हेड टैग के बाहर अपना जावा स्क्रिप्ट कोड लिखने का प्रयास करें। यह निश्चित रूप से काम करेगा। जब मैंने अपने जावा स्क्रिप्ट कोड को पेज के नीचे कॉपी और पेस्ट किया तो हल हो गया। पिछले में इसके टैग टैग को बंद करने से ठीक पहले 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

जिस भाग में सर्वर टैग हैं उसे हटा दें और यदि आप कोड से डायनेमिक नियंत्रण जोड़ना चाहते हैं तो इसे कहीं और रखें

मैंने अपने जावास्क्रिप्ट को पेज के हेड सेक्शन से हटा दिया और पेज के बॉडी में जोड़ दिया और उसे काम करने लगा


0

मेरे मामले में मुझे यह त्रुटि मिली क्योंकि मैं गलत तरीके से इनर html को इसके अंदर html के साथ सेट कर रहा था।

उदाहरण:

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"एक अन्य टैग (करने के लिए body, head...) या निकालें runat="server"कंटेनर से।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.