2010-07-02 9 views
10

मैं एक jQuery समारोह बोल रहा हूँ प्रतीत नहीं होता कोड से एक jQuery समारोह कॉलिंग ...के पीछे में asp.net काम करने के लिए डेटाबेस के लिए एक रिकार्ड डालने के बाद

ScriptManager.RegisterClientScriptBlock(LbOk, typeof(LinkButton), "json", 
          "topBar('Successfully Inserted');", true); 

मैं अपने गुरु को पेज में शामिल किया है , एक पोस्टबैक के बाद jQuery फ़ंक्शन को निष्पादित करने

<script type="text/javascript"> 
    function load() { 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 
     } 
    function EndRequestHandler() 
     { 
      topBar(message); 
    } 


function topBar(message) { 
    alert(a); 
    var alert = $('<div id="alert">' + message + '</div>'); 
    $(document.body).append(alert); 
    var $alert = $('#alert'); 
    if ($alert.length) { 
     var alerttimer = window.setTimeout(function() { 
      $alert.trigger('click'); 
     }, 5000); 
     $alert.animate({ height: $alert.css('line-height') || '50px' }, 200).click(function() { 
      window.clearTimeout(alerttimer); 
      $alert.animate({ height: '0' }, 200); 
     }); 
    } 
} 
    </script> 

<body onload="load();"> 

के लिए लेकिन यह काम करने के लिए ... कोई भी सुझाव ..

+0

चेतावनी (क) बुलाया जा रहा है, या कुछ भी नहीं है? –

+0

@ डेव अलर्ट आया लेकिन इसके नीचे दिए गए बयान निष्पादित नहीं किए गए – bala3569

+0

"अलर्ट" और "$ अलर्ट" के लिए अलग-अलग चर नामों का उपयोग करने का प्रयास करें। मुझे यकीन नहीं है, लेकिन मैं देशी चेतावनी समारोह को फिर से परिभाषित करने से सावधान रहूंगा। यह कम से कम अच्छा कोडिंग अभ्यास नहीं है। –

उत्तर

3

यह मानते हुए कि अपने कोड-पीछे एक UpdatePanel ताज़ा दौरान चल रहा है, हो सकता है नहीं लगता है वहाँ ई अपने EndRequest हैंडलर और आपके कोड-पीछे पंजीकरण के बीच एक बुरी बातचीत हो? शीर्ष बार() को दो बार बुलाया जाना चाहिए, एक बार आपके "सफलतापूर्वक सम्मिलित" संदेश के साथ और फिर एक बार एंड्रॉवेस्ट में एक अपरिभाषित पैरामीटर के साथ (जब तक कि संदेश परिवर्तक को कहीं भी परिभाषित नहीं किया जाता है, हम यहां नहीं देख सकते हैं)।

यह भी ध्यान रखें कि $('#alert') एक से अधिक आइटम लौटा सकता है। यदि टॉपबार() को एक से अधिक बार बुलाया जा रहा है, तो शायद यह मामला है।

कैसे कुछ इस तरह कर रही है, शुरुआत के लिए, कि अनायास ही पक्ष प्रभाव को कम करने के बारे में:

function topBar(message) { 
    var $alert = $('<div/>'); 

    $alert.text(message); 

    $alert.click(function() { 
    $(this).slideUp(200); 
    }); 

    $(body).append($alert); 

    // Doesn't hurt anything to re-slideUp it if it's already 
    // hidden, and that keeps this simple. 
    setTimeout(function() { $alert.slideUp(200) }, 5000); 
} 

कि EndRequest और रजिस्टर * स्क्रिप्ट की समस्या ठीक नहीं होती दोनों को क्रियान्वित करने topbar(), लेकिन यह चाहिए उन्हें विरोधाभासी से दूर रखें ताकि आप देख सकें कि क्या बेहतर हो रहा है।

इसे आज़माएं और हमें बताएं कि क्या चीजें बदलती हैं।

+0

क्या हुआ जब यह काम नहीं हुआ? कुछ भी नहीं? क्या आप सकारात्मक हैं कि एसिंक पोस्टबैक के दौरान जावास्क्रिप्ट त्रुटि या सर्वर-साइड त्रुटि नहीं थी (जो रजिस्टर * स्क्रिप्ट को अपने पेलोड को उत्सर्जित करने से रोकती थी)? यदि आप शीर्षबार() फ़ंक्शन में ब्रेकपॉइंट सेट करने के लिए फ़ायरबग का उपयोग करते हैं, तो क्या यह फ़ंक्शन बिल्कुल सही नहीं होता है जब यह सही काम नहीं करता है? –

3

क्रोम और फ़ायरफ़ॉक्स के साथ, मेरे पास एकमात्र मुद्दा var alert था जो alert() कॉल के समान नाम था।

function topBar(message) { 
     alert(message); 
     var alertDiv = $('<div id="alert">' + message + '</div>'); 
     $(document.body).append(alertDiv); 
     var $alert = $('#alert'); 

यह है कि आपके body टैग जो मतलब यह होगा कि $(document.body) संदर्भ खाली होगा चल स्क्रिप्ट, के समय में लोड नहीं है संभव है - जो jQuery चुपचाप चेतावनी div में जोड़ने के लिए विफल हो जाएगा।

ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "json", 
         "$(document).ready(function() { topBar('Successfully Inserted');});", true); 
4

यहाँ एक पूर्ण काम कर उदाहरण है:: किसी भी तरह से, यह एक $(document).ready घटना में अपने कॉल रैप करने के लिए दर्द होता है कभी नहीं

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" %> 
<script type="text/C#" runat="server"> 
    protected void BtnUpdate_Click(object sender, EventArgs e) 
    { 
     // when the button is clicked invoke the topBar function 
     // Notice the HtmlEncode to make sure you are properly escaping strings 
     ScriptManager.RegisterStartupScript(
      this, 
      GetType(), 
      "key", 
      string.Format(
       "topBar({0});", 
       Server.HtmlEncode("Successfully Inserted") 
      ), 
      true 
     ); 
    }  
</script> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<head> 
    <title></title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
     function topBar(message) { 
      var alert = $('<div id="alert">' + message + '</div>'); 
      $(document.body).append(alert); 
      var $alert = $('#alert'); 
      if ($alert.length) { 
       var alerttimer = window.setTimeout(function() { 
        $alert.trigger('click'); 
       }, 5000); 
       $alert.animate({ height: $alert.css('line-height') || '50px' }, 200).click(function() { 
        window.clearTimeout(alerttimer); 
        $alert.animate({ height: '0' }, 200); 
       }); 
      } 
     } 
    </script> 
</head> 
<body> 
    <form id="Form1" runat="server"> 

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

    <asp:UpdatePanel ID="up" runat="server"> 
     <ContentTemplate> 
      <!-- 
       You could have some other server side controls 
       that get updated here 
      --> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger 
       ControlID="BtnUpdate" 
       EventName="Click" 
      /> 
     </Triggers> 
    </asp:UpdatePanel> 

    <asp:LinkButton 
     ID="BtnUpdate" 
     runat="server" 
     Text="Update" 
     OnClick="BtnUpdate_Click" 
    /> 

    </form> 
</body> 
</html> 
+0

काम करने की पुष्टि की। मेरा कोड UnFreezeScreen() को कॉल करता है। 'ScriptManager.RegisterStartupScript (BTN_Submit, BTN_Submit.GetType()," key "," UnFreezeScreen(); ", True)' –

+0

उस समाधान के लिए धन्यवाद लेकिन अगर मैं जान सकता हूं कि मैं इसे कई क्रियाओं के साथ काम करने और संदेशों का उपयोग करने के लिए कैसे प्राप्त कर सकता हूं कोड से पीछे भेजे गए मामले? अगर आपको समय मिल गया है तो कृपया एक छोटा सा उदाहरण .. धन्यवाद – hsobhy

3

यह सीधे आपके प्रश्न का उत्तर नहीं है, लेकिन अधिक से पारित करने के लिए है अद्यतन पैनलों का उपयोग किये बिना पेज विधियों को कॉल करने के लिए एक और तकनीक पर, लेकिन सीधे jQuery से।

बस अपने पेज विधि को सजाने (codebehind का आंशिक वर्ग में) की तरह तो (इसे स्थिर होना चाहिए):

[WebMethod] 
[ScriptMethod(ResponseFormat=ResponseFormat.Json, XmlSerializeString=true)] 
public static bool UpdateDatabase(string param1 , string param2) 
{ 
    // perform the database logic here... 

    return true; 
} 

उसके बाद, आप सही jQuery के $ .ajax विधि से इस पृष्ठ विधि कॉल कर सकते हैं:

$("#somebutton").click(function() { 

    $.ajax({ 
    type: "POST", 
    url: "PageName.aspx/UpdateDatabase", 
    data: "{ param1: 'somevalue', param2: 'somevalue' }", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data) { 
     if (data.d) { 
     topBar("success!"); 
     } else { 
     topBar("fail"); 
     } 
    } 
    }); 

}); 

यह बहुत आसान है, और बहुत साफ है जो स्क्रिप्ट पंजीकृत करने का प्रयास कर रहा है। या तो एक वेब सेवा बनाने की जरूरत नहीं है।

यह एक शानदार लेख है:

http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/