जावास्क्रिप्ट के साथ ASP.NET पोस्टबैक


81

मेरे पास कई छोटे divएस हैं जो jQueryड्रैगेबल का उपयोग कर रहे हैं । ये divएस एक में रखे गए हैं UpdatePanel, और ड्रैगस्टॉप पर मैं _doPostBack()जावास्क्रिप्ट फ़ंक्शन का उपयोग करता हूं, जहां मैं पेज के फॉर्म से आवश्यक जानकारी निकालता हूं ।

मेरी समस्या यह है कि जब मैं इस फ़ंक्शन को कॉल करता हूं, तो पूरा पृष्ठ फिर से लोड होता है, लेकिन मैं केवल अपडेट पैनल को फिर से लोड करना चाहता हूं।


क्या आपके डिव्स में एक यूनिक आईडी है?
नाथन टेलर

जवाबों:


228

यहाँ एक पूर्ण समाधान है

Asp.net पेज का पूरा फॉर्म टैग

<form id="form1" runat="server">
    <asp:LinkButton ID="LinkButton1" runat="server" /> <%-- included to force __doPostBack javascript function to be rendered --%>

    <input type="button" id="Button45" name="Button45" onclick="javascript:__doPostBack('ButtonA','')" value="clicking this will run ButtonA.Click Event Handler" /><br /><br />
    <input type="button" id="Button46" name="Button46" onclick="javascript:__doPostBack('ButtonB','')" value="clicking this will run ButtonB.Click Event Handler" /><br /><br />

    <asp:Button runat="server" ID="ButtonA" ClientIDMode="Static" Text="ButtonA" /><br /><br />
    <asp:Button runat="server" ID="ButtonB" ClientIDMode="Static" Text="ButtonB" />
</form>

पेज के कोड के पीछे पूरी सामग्री-कक्षा के पीछे

Private Sub ButtonA_Click(sender As Object, e As System.EventArgs) Handles ButtonA.Click
    Response.Write("You ran the ButtonA click event")
End Sub

Private Sub ButtonB_Click(sender As Object, e As System.EventArgs) Handles ButtonB.Click
    Response.Write("You ran the ButtonB click event")
End Sub
  • LinkButton यह सुनिश्चित करने के लिए शामिल है कि __doPostBack जावास्क्रिप्ट फ़ंक्शन क्लाइंट को प्रदान किया गया है। बस बटन नियंत्रण होने से यह __doPostBack फ़ंक्शन प्रदान नहीं करेगा। यह फ़ंक्शन अधिकांश ASP.NET पृष्ठों पर विभिन्न प्रकार के नियंत्रण रखने के आधार पर प्रदान किया जाएगा, इसलिए एक खाली लिंक बटन की आमतौर पर आवश्यकता नहीं होती है

क्या चल रहा है?

दो इनपुट नियंत्रण ग्राहक को प्रदान किए जाते हैं:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
  • __EVENTTARGET __doPostBack का तर्क 1 प्राप्त करता है
  • __EVENTARGUMENT __doPostBack का तर्क 2 प्राप्त करता है

__DoPostBack फ़ंक्शन को इस तरह प्रस्तुत किया गया है:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
  • जैसा कि आप देख सकते हैं, यह छिपे हुए आदानों को मान प्रदान करता है।

जब फॉर्म सबमिट / पोस्टबैक होता है:

  • यदि आपने सर्वर-कंट्रोल बटन का यूनीकआईडी प्रदान किया है जिसका बटन-क्लिक-हैंडलर आप चलाना चाहते हैं ( javascript:__doPostBack('ButtonB',''), तो उस बटन के लिए बटन क्लिक हैंडलर चलाया जाएगा।

क्या होगा अगर मैं एक क्लिक हैंडलर नहीं चलाना चाहता, लेकिन इसके बजाय कुछ और करना चाहता हूं?

आप जो चाहें बहस कर सकते हैं __doPostBack

फिर आप छिपे हुए इनपुट मानों का विश्लेषण कर सकते हैं और तदनुसार विशिष्ट कोड चला सकते हैं:

If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
    Response.Write("Do Something else") 
End If

अन्य नोट

  • क्या होगा अगर मुझे उस नियंत्रण की आईडी नहीं पता है जिसके क्लिक हैंडलर को मैं चलाना चाहता हूं?
    • यदि यह सेट करने के लिए स्वीकार्य नहीं है ClientIDMode="Static", तो आप ऐसा कुछ कर सकते हैं __doPostBack('<%= myclientid.UniqueID %>', ''):।
    • या: __doPostBack('<%= MYBUTTON.UniqueID %>','')
    • यह जावास्क्रिप्ट में नियंत्रण की अनूठी आईडी को इंजेक्ट करेगा, क्या आपको इसकी इच्छा करनी चाहिए

48
पूर्णता के लिए +1। महान जवाब जो मुझे StackOverflow प्यार की तरह।
मणित्रा आंद्रिमितंड्रा

3
यह सबसे अच्छा स्पष्टीकरण है जो मैं कभी भी __doPostBack () .. +10 के लिए ले आया हूँ!
गुरु

1
@BrianWebster, आपके विस्तृत पोस्ट के लिए बहुत धन्यवाद। क्या मैं किसी को भी सुझाव दे सकता हूं जो अभी भी ASP.NET 3.5 के साथ है और नीचे VB.NET के बजाय C का उपयोग कर रहा है। .aspx फ़ाइल के अंतिम दो पंक्तियों को अनुसरण के रूप में बदलता है? <asp: बटन रनरैट = "सर्वर" ID = "ButtonA" टेक्स्ट = "ButtonA" OnClick = "ButtonA_Click" /> <br /> <br /> <asp: बटन रनरैट = "सर्वर" ID = "ButtonB" पाठ = "ButtonB" OnClick = "ButtonB_Click" />
yangli.liy

1
यह एक बहुत ही उपयोगी उपाय है। यदि आप मास्टर पृष्ठों का उपयोग कर रहे हैं, तो बटनों की आईडी थोड़ी बाधित हो जाती है। पोस्टबैक के लिए सही आईडी प्राप्त करने में सहायता के लिए नीचे देखें user489998 का ​​उत्तर।
DCastenholz

1
@BrianWebster यह वास्तव में किसी के लिए किसी की समस्या का पूर्ण समाधान प्रदान करने में सक्षम होने और संभावित विचलन के लिए उपयुक्त विकल्प प्रदान करने के लिए दुर्लभ है।
गोल्डबिश्प

15

प्रति Phairoh: पैनल का नाम बदलने की स्थिति में पृष्ठ / घटक में इसका उपयोग करें

<script type="text/javascript">
     <!--
     //must be global to be called by ExternalInterface
         function JSFunction() {
             __doPostBack('<%= myUpdatePanel.ClientID  %>', '');
         }
     -->
     </script>

10

जबकि Phairoh का समाधान सैद्धांतिक रूप से ध्वनि लगता है, मैंने इस समस्या का एक और समाधान भी खोज लिया है। DoPostBack फंक्शन के लिए UpdatePanels id को paramater (इवेंट टारगेट) के रूप में पास करके अपडेट पैनल वापस नहीं बल्कि पूरे पेज को पोस्ट कर देगा।

__doPostBack('myUpdatePanelId','')

* नोट: दूसरा पैरामीटर अतिरिक्त ईवेंट आर्ग के लिए है

उम्मीद है कि यह किसी की मदद करता है!

संपादित करें: ऐसा लगता है कि यह सलाह का एक ही टुकड़ा ऊपर दिया गया था जैसा कि मैं टाइप कर रहा था :)


2
यह काम करेगा, और मैंने एक आवेदन में कुछ ऐसा ही किया है, लेकिन यह वास्तव में एक अच्छा विचार नहीं है और मुझे नफरत है कि मुझे ऐसा करना पड़ा जब मैंने किया। यदि आपके अपडेट पैनल का नाम कभी बदलता है, तो यह टूट जाता है। यदि आप इसे कभी उपयोगकर्ता नियंत्रण के अंदर रखते हैं, तो यह टूट जाता है। यदि आप एक मास्टरपेज जोड़ते हैं, तो यह टूट जाता है। हां यह काम करता है, लेकिन यह काफी नाजुक है। बहुत कम से कम, कृपया स्थैतिक स्ट्रिंग के बजाय अपने अपडेट पैनल के क्लाइंट आईडी का उपयोग करें।
फिराह

9

__doPostBackसीधे उपयोग करना 2000 के दशक का समय है। 2018 में कोई भी WebForms कोडिंग GetPostBackEventReference का उपयोग करता है

(हालांकि अधिक गंभीरता से, इसे पूर्णता के लिए एक उत्तर के रूप में जोड़ना। __doPostBackसीधे प्रयोग का उपयोग करना बुरा व्यवहार है (एकल अंडरस्कोर उपसर्ग आमतौर पर एक निजी सदस्य को इंगित करता है और डबल एक अधिक सार्वभौमिक निजी सदस्य को इंगित करता है), हालांकि यह संभवतः बदल नहीं जाएगा या इस पर अप्रचलित हो जाएगा बिंदु। हमारे पास ClientScriptManager.GetPostBackEventReference में पूरी तरह से समर्थित तंत्र है ।)

अपना btnRefresh मानकर हमारे UpdatePanel के अंदर है और पोस्टबैक का कारण बनता है, आप इस तरह ( प्रेरणा ) GetPostBackEventReference का उपयोग कर सकते हैं :

function RefreshGrid() {
    <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}

यह बहुत अच्छा काम करता है। मेरी स्थिति में, मैं लक्ष्य AJAX नियंत्रणों को ताज़ा करने की घोषणा कर सकता हूं जब btnRefresh को HTML मार्कअप में क्लिक किया जाता है। इस का उपयोग करके, यह AJAX के लिए समर्थन के साथ इसे लागू करने के लिए यह बहुत आसान बना दिया।
डेनियल

6

अगर किसी को इससे परेशानी हो रही है (जैसा कि मैं था), आप इसके लिए UseSubmitBehavior = "false" विशेषता जोड़कर एक बटन के लिए पोस्टबैक कोड प्राप्त कर सकते हैं। यदि आप बटन के प्रदान किए गए स्रोत की जांच करते हैं, तो आपको सटीक जावास्क्रिप्ट दिखाई देगी जिसे आपको निष्पादित करने की आवश्यकता है। मेरे मामले में यह आईडी के बजाय बटन के नाम का उपयोग कर रहा था।


मास्टर पृष्ठों का उपयोग करते समय बहुत उपयोगी।
DCastenholz

1
__doPostBack हमेशा मास्टर पृष्ठों का उपयोग करते समय बटन के नाम का उपयोग करता है।
डेनिस टी

2

क्या आपने अपडेट पैनल के क्लाइंट आईडी को __doPostBack फ़ंक्शन में पास करने की कोशिश की है? मेरी टीम ने एक अपडेट पैनल को रीफ्रेश करने के लिए ऐसा किया है और जहां तक ​​मुझे पता है कि यह काम कर रहा है।

__doPostBack(UpdatePanelClientID, '**Some String**');

1

सबसे पहले, अपडेट पैनल का उपयोग न करें। वे दूसरी सबसे बुरी चीज़ हैं जो Microsoft ने कभी वेब डेवलपर के लिए बनाई हैं।

दूसरा, यदि आपको अपडेट पैनल का उपयोग करना है , तो अपडेटमोड संपत्ति को सशर्त में सेट करने का प्रयास करें। इसके बाद Asp: हिडन कंट्रोल जिसे आप पेज में जोड़ते हैं, में एक ट्रिगर जोड़ें। ट्रिगर के रूप में परिवर्तन ईवेंट असाइन करें। अपने ड्रैगस्टॉप इवेंट में, छिपे हुए नियंत्रण के मूल्य को बदलें।

यह अप्रयुक्त है, लेकिन सिद्धांत ध्वनि लगता है ... यदि यह काम नहीं करता है, तो आप एस्प: बटन के साथ एक ही चीज की कोशिश कर सकते हैं, बस प्रदर्शन को सेट करें: इस पर कोई भी शैली नहीं है और परिवर्तन घटना के बजाय क्लिक इवेंट का उपयोग करें।


7
वेब डेवलपर्स के लिए Microsoft द्वारा बनाई गई पहली सबसे बुरी चीज़ क्या है?
ErnieStings

2
उस सूची में लॉगिन नियंत्रण बहुत अधिक होना चाहिए।
kim3er

1
क्या आप कुछ स्पष्टीकरण प्रदान कर सकते हैं जो अपडेटपैनल्स को इतनी बुरी चीज बनाता है? यदि ऐसा है, तो मैं कुछ कारणों को पढ़ना चाहूंगा कि उनका उपयोग क्यों और कब किया जाए। अब तक मैंने अपडेटपैनल्स के साथ किसी भी महत्वपूर्ण समस्या पर ठोकर नहीं खाई है।
१:03:०५ पर जन कुक्क़ा जनवरी २a

@JanKukacka वे AJAX के एक गरीब अमूर्त हैं। अद्यतन पैनल लिखने में आप जो कौशल सीखते हैं, वह ASP.NET वेब फॉर्म्स के बाहर कुछ भी AJAX का ठीक से उपयोग करने में सक्षम नहीं होता है। UpdatePanels को डीबग करना मुश्किल है। और अगर आपके पास ViewState है, तो डेटा की एक बड़ी मात्रा को सर्वर से / से अनावश्यक रूप से स्थानांतरित कर दिया जाता है, जिससे यह बैंडविड्थ गहन हो जाता है। उचित AJAX सीखना (शायद कुछ हल्के अमूर्त परत जैसे कि jQuery के साथ) एक बेहतर समाधान है, जब आपको पोस्टबैक प्रदर्शन किए बिना सर्वर से बात करने की आवश्यकता होती है।
राजमिस्त्री

1

आप कॉल नहीं कर सकते _doPostBack()क्योंकि यह फ़ॉर्म को प्रस्तुत करने के लिए मजबूर करता है। आप इस PostBackपर अक्षम क्यों नहीं हैं UpdatePanel?


1
एक प्रश्न। जब एक div घसीटा जाता है _doPostBack आपके द्वारा या ASP.NET द्वारा स्वचालित रूप से मंगवाया जाता है?
एलेक्स रोड्रिग्स

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