2010-05-13 14 views
12

नीचे के दौरान पंजीकृत है कैसे जाँच करने के लिए कोड मैं वर्तमान में क्रियान्वित किया है है।अगर ग्राहक स्क्रिप्ट पहले से ही एक आंशिक पोस्टबैक

if (!Page.ClientScript.IsStartupScriptRegistered(Page.GetType(), scriptKey)) 
{ 
    ScriptManager scriptManager = ScriptManager.GetCurrent(page); 
    if (scriptManager != null && scriptManager.IsInAsyncPostBack) 
    { 
    //if a MS AJAX request, use the Scriptmanager class 
    ScriptManager.RegisterStartupScript(Page, Page.GetType(), scriptKey, script, true); 
    } 
    else 
    { 
    //if a standard postback, use the standard ClientScript method 
    Page.ClientScript.RegisterStartupScript(Page.GetType(), scriptKey, script, true); 
    } 
} 
रूप this जवाब में सुझाव दिया ताकि मैं अर्थात जब वहाँ आंशिक पोस्टबैक और एक पूर्ण पोस्टबैक है दोनों बार पर स्टार्टअप स्क्रिप्ट रजिस्टर कर सकते हैं मैं कर रहा हूँ

समस्या Page.ClientScript.IsStartupScriptRegistered(Page.GetType(), scriptKey) है हमेशा (यहां तक ​​कि जब स्क्रिप्ट से पहले पंजीकृत है) झूठे रिटर्न जब यह आंशिक पोस्टबैक है। और मुझे ScriptManager नहीं मिला। IStartupScriptRegistered (स्थिर) विधि। इसके परिणामस्वरूप, सभी आंशिक/async पोस्टबैक पर अतिरिक्त स्क्रिप्ट उत्सर्जित की जाती है।

कृपया ध्यान दें कि मैं अपने मास्टरपेज में AjaxControlToolkit संस्करण 4.1 यानी ToolkitScriptManager के स्क्रिप्ट प्रबंधक का उपयोग कर रहा हूं। लेकिन मुझे कोई बात नहीं है कि इसके साथ कुछ करना है।

अद्यतन

<asp:UpdatePanel ID="ContactDetailsUpdatePanel" UpdateMode="Conditional" runat="server"> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="UpdateContactDetailsButton" EventName="Click" /> 
    </Triggers> 
    <ContentTemplate> 
     <div id="ContactDetailsContent" class="contact_details_content"> 
     <div class="customer_contactdetails_left_pane"> 
      <div class="customer_name_field"> 
      <asp:Label ID="CustomerNameLabel" runat="server" Text="Customer" /> 
      <asp:TextBox ID="CustomerNameValue" runat="server" /> 
      </div> 
      <div class="customer_address_field"> 
      <asp:Label ID="CustomerAddressLabel" runat="server" Text="Address" /> 
      <asp:TextBox ID="CustomerAddressValue" runat="server" /> 
      <asp:TextBox ID="CustomerAddressValue1" runat="server" /> 
      <asp:TextBox ID="CustomerAddressValue2" runat="server" /> 
      <asp:TextBox ID="CustomerAddressValue3" runat="server" /> 
      </div> 
      <div class="customer_postcode_field"> 
      <asp:Label ID="CustomerPostcodeLabel" runat="server" Text="Postcode" /> 
      <asp:TextBox ID="CustomerPostcodeValue" runat="server" /> 
      </div> 
     </div> 
     <div class="customer_contactdetails_right_pane"> 
      <div> 
      <asp:Label ID="CustomerContactLabel" runat="server" Text="Contact" /> 
      <asp:TextBox ID="CustomerContactValue" runat="server" /> 
      </div> 
      <div> 
      <asp:Label ID="CustomerTelephoneLabel" runat="server" Text="Telephone" /> 
      <asp:TextBox ID="CustomerTelephoneValue" runat="server" /> 
      </div> 
      <div> 
      <asp:Label ID="CustomerMobileLabel" runat="server" Text="Mobile" /> 
      <asp:TextBox ID="CustomerMobileValue" runat="server" /> 
      </div> 
      <div> 
      <asp:Label ID="CustomerFaxLabel" runat="server" Text="Fax" /> 
      <asp:TextBox ID="CustomerFaxValue" runat="server" /> 
      </div> 
      <div> 
      <asp:Label ID="CustomerEmailLabel" runat="server" Text="Email" /> 
      <asp:TextBox ID="CustomerEmailValue" runat="server" /> 
      </div> 
      <div> 
      <asp:Label ID="CustomerWebLabel" runat="server" Text="Web" /> 
      <asp:TextBox ID="CustomerWebValue" runat="server" /> 
      </div> 
     </div> 
     </div> 
     <div class="update_button_field"> 
     <asp:Button ID="UpdateContactDetailsButton" runat="server" Text="Update" 
      onclick="UpdateContactDetailsButton_Click" /> 
     </div>   
    </ContentTemplate>  
    </asp:UpdatePanel> 

अग्रिम धन्यवाद।

नोट: इस समस्या पर प्रगति को समझने में सक्षम होने के लिए, कृपया उत्तर देने से पहले this उत्तर पर टिप्पणियां देखें।

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

इस पोस्ट के लिए विचारों के रूप में वृद्धि हो रही है, मैं वहाँ अन्य लोग हैं, जो भी इस समस्या का जवाब चाहते हो सकता है हैं कि देख सकते हैं।

उत्तर

0

आपका मतलब है यह: ClientScriptManager.IsStartupScriptRegistered Method

+0

पूरी समस्या को समझने के लिए कृपया http://stackoverflow.com/questions/1952817/asp-net-javascript-inside-ajax-updatepanel/1953122#1953122 पर जाएं। Page.ClientScript.IsStartupScriptRegistered() मुझे यह http://msdn.microsoft.com/en-us/library/62d1676x.aspx केवल देता है। और आंशिक पोस्ट बैक के मामले में यह हमेशा झूठा होता है। – IsmailS

+0

मैंने अभी मार्कअप जोड़ा है। – IsmailS

+0

इससे मेरी मदद नहीं हुई। मुझे नहीं पता कि इसे किसने वोट दिया। मैं पहले से ही इस विधि का उपयोग कर रहा हूं और मेरे प्रश्न में इसका उल्लेख है। – IsmailS

1

ध्यान रखें कोड की पहली रेखा ! की वजह से विधि वापसी मान का उल्टा होता है।

if (!Page.ClientScript.IsStartupScriptRegistered(Page.GetType(), scriptKey)) 

तो IsStartupScriptRegisteredfalse लौटा रहा है के रूप में आप कहते हैं, तो अगर बयान ! की वजह से true मूल्यांकन करना चाहिए। यह स्क्रिप्ट को अपेक्षित के रूप में पंजीकृत होना चाहिए।

आपका कोड my answer here, जो ASP.NET AJAX 1.0 और ASP.NET 2.0 पर आधारित था पर आधारित है। यह .NET 3.5 के साथ कुछ करने के लिए हो सकता है, हालांकि मुझे विश्वास है कि मैंने पहले से ही एक नई परियोजना में 3.5 से कम किया है और यह ठीक काम किया है ...

क्या आप कोड के साथ जाने के लिए कुछ मार्कअप पोस्ट कर सकते हैं ?

संपादित करें: मार्कअप पोस्ट करने के लिए धन्यवाद।

आप ToolkitScriptManager उपयोग कर रहे हैं उल्लेख किया:

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

अगर कथन पर ब्रेकपॉइंट जोड़ने का प्रयास करें और सुनिश्चित करें कि यह सत्य का मूल्यांकन है। मुझे आश्चर्य नहीं होगा अगर scriptManagernull है, या scriptManager.IsInAsyncPostBackfalse है क्योंकि आप ToolkitScriptManager का उपयोग कर रहे हैं।

ScriptManager scriptManager = ScriptManager.GetCurrent(page); 
if (scriptManager != null && scriptManager.IsInAsyncPostBack) 
{ 
    //if a MS AJAX request, use the Scriptmanager class 
    ScriptManager.RegisterStartupScript(Page, Page.GetType(), scriptKey, script, true); 
} 

अन्त में - अपने मार्कअप ठीक है, अन्य लग रहा है की तुलना में आप <Triggers> अनुभाग जरूरत नहीं है। ट्रिगर्स आपको आंशिक रेंडर करने के लिए आपके अपडेट पैनल के बाहर नियंत्रण निर्दिष्ट करने की अनुमति देता है। <ContentTemplate> अनुभाग के भीतर अद्यतन पैनल का कोई भी बाल नियंत्रण स्वचालित रूप से ऐसा करेगा। ट्रिगर अनुभाग में आप जिस बटन को लक्षित कर रहे हैं वह पहले ही अपडेट पैनेल में है। जबकि मुझे नहीं लगता कि यह आपकी समस्या का कारण है, मैं वैसे भी इसे हटा दूंगा।

उम्मीद है कि इससे मदद मिलती है।

+0

मुझे लगता है कि '! 'के साथ कोई समस्या नहीं है क्योंकि मैं केवल स्क्रिप्ट पंजीकृत करना चाहता हूं, जब यह ** ** पहले से पंजीकृत नहीं है। हां मेरा कोड आपके उत्तर पर आधारित है। यह मेरे प्रश्न में पहले से ही उल्लेख किया गया है। फिर से सहायता के लिए धन्यवाद। जब मैं सोमवार को कार्यालय जाता हूं तो मैं मार्कअप पोस्ट करूंगा। मेरे पास अभी यह नहीं है। मूल रूप से पोस्ट बैक एक अपडेट पैनल के भीतर एक बटन द्वारा किया जाता है जो AjaxControlToolkit के TabContainer के अंदर है। – IsmailS

+0

@ केपी! मैंने अब मार्कअप जोड़ा है। – IsmailS

+0

@Ismail ठीक है मैंने अपने उत्तर में एक अद्यतन पोस्ट किया है। मुझे लगता है कि जब आप ToolkitScriptManager का उपयोग कर रहे हैं तो आपकी समस्या यह है कि आप ScriptManager का संदर्भ दे रहे हैं। (ऊपर देखें) –

2

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

+0

यह बहुत समय पहले दिया गया था, लेकिन क्या आपको कभी भी कुछ बेहतर मिला? – paqogomez

+0

पुलिस। मेरी और परियोजनाओं में, मैंने माइक्रोसॉफ्ट अजाक्स नियंत्रणों का कभी भी उपयोग नहीं किया है। तो फिर से इसका सामना नहीं किया। – IsmailS

2

मैंने स्क्रिप्ट मैनेजर के साथ पहले से ही पंजीकृत किया है या नहीं, यह जांचने के लिए एक विस्तार विधि लिखा है। आप स्टार्टअप स्क्रिप्ट की जांच करने के लिए एक ही सिद्धांत का उपयोग कर सकते हैं:

public static bool IsClientScriptBlockRegistered(this ScriptManager sm, string key) 
     { 
      ReadOnlyCollection<RegisteredScript> scriptBlocks = sm.GetRegisteredClientScriptBlocks(); 

      foreach (RegisteredScript rs in scriptBlocks) 
      { 
       if (rs.Key == key) 
        return true; 
      } 

      return false; 
     } 
+0

+1 अच्छा लग रहा है। लेकिन मुझे नहीं पता कि यह काम करेगा या नहीं, भले ही क्लाइंट स्क्रिप्ट पहले उसी कुंजी के साथ AsyncPostBacks में पंजीकृत हों। मुझे जवाब के रूप में स्वीकार करने से पहले मुझे जांच करनी होगी। – IsmailS

+0

मैंने कोशिश की और यह पिछले partialpostacks से याद नहीं है। – jheizer

4

मैं जब ASP.Net में एक समग्र नियंत्रण लिख यह एक ही मुद्दे में भाग गया। जब नियंत्रण एक अद्यतन पैनल के अंदर था पृष्ठ। क्लाइंटस्क्रिप्ट। IStartupScriptRegistered काम नहीं किया था। विधि संरक्षित ओवरराइड शून्य CreateChildControls भीतर से() मैं की तरह

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), initializeTokenInputScriptKey, initializeTokenInputScript, true); 

इसलिए मैं एक स्थिति आप यहाँ क्या वर्णन करने के लिए समान में भाग कुछ कर रहा था। क्या हल हुआ मेरी समस्या पृष्ठ और पेज प्रकार के बजाय नियंत्रण और उसके प्रकार को स्क्रिप्ट मैनेजर को पास कर रही थी। रजिस्ट्रार स्टार्टअपस्क्रिप्ट। इसलिए कोड अब लग रहा है,

ScriptManager.RegisterStartupScript(this, this.GetType(), initializeTokenInputScriptKey, initializeTokenInputScript, true); 

एक बार मैं इस परिवर्तन मैं अब Page.ClientScript.IsStartupScriptRegistered जाँच करने के लिए आवश्यक था। अब मेरा नियंत्रण अद्यतन पैनलों के साथ या बिना काम करता है। कोई अनावश्यक जेएस spitouts या तो। उम्मीद है कि यह

9

मदद करता है यदि आप इसका उपयोग कर रहे हैं;

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "noPasswordMatch", script, true); 

तो जाँच करने के लिए अगर यह पंजीकृत किया गया है तो आप इस का उपयोग करना चाहिए:

if (Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "noPasswordMatch")) 

if (Page.ClientScript.IsClientScriptBlockRegistered("noPasswordMatch")) काम नहीं करता है!

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