2010-05-19 10 views
5

के अंदर जावास्क्रिप्ट कोड ठीक है: मुझे एक एएसपीएक्स पेज पर एक अपडेटपेनल मिला है जिसमें एक प्लेसहोल्डर है।अपडेटपेनल

इस प्लेसहोल्डर के अंदर मैं कुछ बाहरी स्थितियों के आधार पर उपयोगकर्ता नियंत्रणों में से एक को जोड़ रहा हूं (यह एक कॉन्फ़िगरेशन पृष्ठ है)।

इनमें से प्रत्येक उपयोगकर्ता नियंत्रण में एक bindUcEvents() जावास्क्रिप्ट फ़ंक्शन है जो विभिन्न jQuery और जावास्क्रिप्ट ईवेंट को उपयोगकर्ता नियंत्रण के अंदर बटन और सत्यापनकर्ताओं से जोड़ता है।

मेरे पास जो मुद्दा है वह यह है कि उपयोगकर्ता नियंत्रण की जावास्क्रिप्ट को पहचाना नहीं जा रहा है। आम तौर पर, अपडेटपेनल के अंदर जावास्क्रिप्ट निष्पादित होता है जब अद्यतन पैनेल पोस्ट करता है, हालांकि इस कोड में से कोई भी पृष्ठ पृष्ठ द्वारा नहीं पाया जा सकता है (मैंने फ़ायरबग के कंसोल के माध्यम से मैन्युअल रूप से फ़ंक्शन चलाने का प्रयास किया है, लेकिन यह मुझे बताता है कि यह फ़ंक्शन नहीं ढूंढ सकता है)।

क्या किसी के पास कोई सुझाव है?

चीयर्स, एड।

संपादित करें:

(लेकिन कार्यात्मक) में कटौती उदाहरण:

मार्कअप:

<script src="/js/jquery-1.3.2.min.js"></script> 
    <form id="form1" runat="server"> 
    <div> 

    <asp:ScriptManager ID="Script" runat="server" /> 

    <asp:Button ID="Postback" runat="server" Text="Populate" OnClick="PopulatePlaceholder" /> 

    <asp:UpdatePanel ID="UpdateMe" runat="server"> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="Postback" EventName="Click" /> 
    </Triggers> 
     <ContentTemplate> 
      <asp:Literal ID="Code" runat="server" /> 
      <asp:PlaceHolder ID="PlaceMe" runat="server" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    </div> 
</form> 

सी #:

protected void PopulatePlaceholder(object sender, EventArgs e) 
{ 
    Button button = new Button(); 
    button.ID = "Push"; 
    button.Text = "push"; 
    button.OnClientClick = "javascript:return false;"; 
    Code.Text = "<script type=\"text/javascript\"> function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); } bindEvents(); </script>"; 
    PlaceMe.Controls.Add(button); 
} 

आप उस बटन poput नहीं करता देखेंगे चेतावनी संदेश, भले ही कोड पृष्ठ पर मौजूद है।

EDIT2:

ठीक है, बस इसे स्पष्ट करना, उत्पादन कोड काफी बस एक ही समारोह एक शाब्दिक पर बाध्य की तुलना में अधिक जटिल है, और

<%= Control.ClientID %> 

बिट्स की की एक बड़ी संख्या में शामिल है कोड जो गैर-विशिष्ट कार्यों में कारक करना बहुत मुश्किल होगा, और व्यर्थ है क्योंकि वे केवल एक ही स्थान पर उपयोग किए जाते हैं (हम बहुत विशिष्ट सत्यापन और अजीब पॉपआउट ट्रिगर + कुछ तर्क) की बात कर रहे हैं।

+1

क्या आप कुछ स्रोत या जेनरेट कोड पोस्ट कर सकते हैं? इसके बिना निदान करना बहुत मुश्किल है। – scunliffe

+0

निश्चित रूप से, मैं बस ऐसा करने से बचने के लिए प्रवृत्त हूं क्योंकि इसमें बहुत कुछ है, मैं कोशिश करूँगा और इसे थोड़ा सा –

+0

नीचे काट दूंगा आपने कहा है कि आपके पास बहुत सारे कोड हैं, और इसलिए यह कोड-पीछे नहीं है। .. तो यह कहां है? एएसपीएक्स में? बाहरी जेएस फ़ाइल में? किसी डेटाबेस/xml फ़ाइल से लोड किया गया है और पीछे कोड द्वारा पढ़ा गया है? Ascx फ़ाइल में – Stobor

उत्तर

8

उस शाब्दिक नियंत्रण से छुटकारा पाएं और अपनी स्क्रिप्ट पंजीकृत करने के लिए ScriptManager का उपयोग करें। आप जो कर रहे हैं, उसी कारण से काम नहीं करता

window.document.getElementById('someId').innerHtml = "<script type=\"text/javascript\">alert('hey');</script>"; 

काम नहीं करता है। इसे आज़माएं:

protected void PopulatePlaceholder(object sender, EventArgs e) 
{ 
    Button button = new Button(); 
    button.ID = "Push"; 

    button.Text = "push"; 
    button.OnClientClick = "return false;"; 


    string script = "function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); } bindEvents();"; 

    ScriptManager.RegisterClientScriptBlock(this.Page, typeof(SomeClass), Guid.NewGuid().ToString(), script, true); 


    PlaceMe.Controls.Add(button); 
} 

RegisterClientScriptBlock के पैरामीटर को बदलने की आवश्यकता हो सकती है, लेकिन आपको विचार मिलता है।

+3

रखरखाव शून्य पर गिर जाता है हालांकि अगर मैं ऐसा करता हूं: हम जेएस की 200 लाइनों के बारे में बात कर रहे हैं जो बहुत सी चीजें करता है, जिनमें से अधिकांश नियंत्रण क्लाइंट आईडी का उपयोग कर रहे हैं। बैकएंड में होने पर उस तरह का कोड बनाए रखना बहुत मुश्किल है ... –

+1

आपको अपनी स्क्रिप्ट को फिर से प्रतिक्रिया करने की आवश्यकता है। ऐसा करने का यह सही तरीका है। माफ़ कीजिये। –

+1

यानी, आपको स्क्रिप्ट को फिर से लिखना होगा ताकि उन्हें जेएस फाइलों में रखा जा सके। फिर आपको ScriptManager को कॉल करना होगा।रजिस्टर क्लाइंटस्क्रिप्टब्लॉक और स्क्रिप्ट मैनेजर। रजिस्ट्रार स्टार्टअपस्क्रिप्ट आवश्यकतानुसार। स्क्रिप्ट मैनेजर को कॉल किए बिना काम करने के लिए आप जो करने की कोशिश कर रहे हैं, उसे पाने का कोई तरीका नहीं है। एसीएक्स/एएसपीएक्स में लिपियों को वैसे भी अच्छा अभ्यास नहीं है और प्रदर्शन में मदद नहीं करता है। –

2

अपने पृष्ठ पर स्क्रिप्ट प्रबंधक (अजाक्स एक्सटेंशन) जोड़ें और उस प्रबंधक के अंदर अपनी स्क्रिप्टें जोड़ें। प्रबंधक प्रत्येक स्क्रिप्ट टैग को AJAX- आधारित-पेजेलोड (और केवल प्रारंभिक लोड नहीं) पर लोड करेगा - अपडेट पैनेल के अंदर सभी आवश्यक जावास्क्रिप्ट कोड को ले जाएं और आप बहुत अधिक कर चुके हैं।

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
     <Scripts> 
      <asp:ScriptReference Path="../lib/jquery-1.2.6.pack.js" /> 

प्रश्न पर्याप्त पर्याप्त (और नमूना के बिना) नहीं पढ़ा। मेरी नई प्रतिक्रिया देखें।

+1

आपको अपडेट पैनेल का उपयोग करने के लिए एक स्क्रिप्ट प्रबंधक की आवश्यकता है, और कोड उपयोगकर्ता नियंत्रण (पृष्ठ पर एम्बेडेड) के लिए सभी आंतरिक है क्योंकि यह नियंत्रण-विशिष्ट आईडी का उपयोग करता है, इसलिए यह वास्तव में मदद करने के लिए साइन इन नहीं है। –

5

कुछ js फिर से चलाने के लिए के बाद एक अद्यतन पैनल मैं हमेशा इस

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
    function(sender, args) { 
     //update whatever here 
    }); 

का उपयोग किया है इसके अलावा, अगर आप अद्यतन पैनल के भीतर तत्वों के सभी संदर्भ है आपको लगता है कि समारोह के भीतर उन चर ताज़ा कर सकते हैं निकाल दिया गया है साथ ही, अन्यथा आपके पास पुराना रेफ होगा जो काम नहीं करेगा।

+0

हाँ, दुर्भाग्यवश केवल तभी काम करता है जब कोड मूल पृष्ठ पर पहले स्थान पर मौजूद हो। चूंकि मैं गतिशील नियंत्रण का उपयोग कर रहा हूं और इसे अद्यतनपैनेल (यानी जावास्क्रिप्ट के माध्यम से) के माध्यम से लोड कर रहा हूं, नए जावास्क्रिप्ट कार्यों को फ़ंक्शंस के रूप में पहचाना नहीं गया है! –

+0

हमम ... मुझे पता है कि evals वापस गिरने के लिए सबसे अच्छी बात नहीं है, लेकिन ऊपर सूचीबद्ध UpdatePanel कॉलबैक के भीतर इस कॉल को रखने के बारे में क्या? ... // जो कुछ भी eval (document.getElementById ('Code')। InnerHtml) अद्यतन करें; ... – Justin

+0

काम कर सकता है, लेकिन यह आखिरी चीज है जिसे मैं सहारा लेना चाहता हूं! –

-1

किसी भी तरह यह आपका कोड लगता है।पाठ कहीं भी अनुवाद में खो जाता है - विशिष्टताओं को नहीं जानते, शायद यह डिजाइन द्वारा है;

protected void PopulatePlaceholder(object sender, EventArgs e) 
    { 
     Button button = new Button(); 
     button.ID = "Push"; 
     button.Text = "push"; 
     button.OnClientClick = "javascript:return false;"; 
//  Code.Text = 
     PlaceMe.Controls.Add(button); 
     PlaceMe.Controls.Add(new LiteralControl("<script type=\"text/javascript\"> function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); } bindEvents(); </script>")); 
    } 

चूंकि आप पहले से codebehind से JavaScript कोड का निर्माण कर रहे आप के साथ-साथ गतिशील रूप से भी नियंत्रण जोड़ सकते हैं: वैसे भी अगले काम करता है।

+0

यह छोटा उदाहरण केवल मेरी प्रक्रिया का संकेत है, असली कोड जावास्क्रिप्ट की लगभग 200 लाइनें है जो कुछ जटिल सामग्री करता है। मुझे इसे बनाए रखने की ज़रूरत है, इसलिए वास्तव में कोड में जावास्क्रिप्ट को रखने का कोई विकल्प नहीं है! –

+0

अपने नमूने में आप पहले ही कोड बना रहे हैं। कोडबेंड से आगे; अब आप बता रहे हैं कि आप जावास्क्रिप्ट को कोडबेंड से निष्पादित नहीं करना चाहते हैं ?? मुझे लगता है कि आप कॉल के साथ अलर्ट को एक नए फ़ंक्शन में बदल देंगे, आईडी को पैरामीटर के रूप में पास कर सकते हैं या ऐसा कुछ भी कर सकते हैं - वैसे भी - – riffnl

+0

में मदद करने की कोशिश कर रहा हूं, मैं समझता हूं कि, हालांकि मैंने कहा था कि इसके लिए और भी कुछ था मेरे मूल पोस्ट में। –

0

हो सकता है कि आप इस के लिए देख रहे हैं: http://api.jquery.com/live/

लगभग .bind() संगत (ऊपर लिंक में सूचीबद्ध अपवाद) - लेकिन यह भी जोड़ा तत्वों/बाद में बदल को बांधता है।

या शायद भी दे सकते हैं। डिलीगेट() एक कोशिश - सीधे .bind() कॉल को प्रतिस्थापित नहीं कर सकता है, लेकिन ज्यादातर मामलों में यह बहुत तेज है।

संबंधित मुद्दे