2010-07-02 5 views
10

ich eine jQuery-Funktion anzurufenden zu arbeiten, nachdem eine Aufzeichnung Datenbank einfügen ...eine Jquery-Funktion aus dem Code aufrufen hinter in asp.net scheint nicht

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

ich dies in meinem Masterseite enthalten sind, jquery Funktion nach einer Postbacks zum Ausführen

<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();"> 

Aber es scheint nicht zu funktionieren ... Jeder Vorschlag ..

+0

Ist der Alarm (a) genannt wird, oder gar nichts? –

+0

@Dave Alert kam, aber die Anweisungen darunter wird nicht ausgeführt – bala3569

+0

versuchen, verschiedene Variablennamen für "alert" und "$ alert". Ich bin mir nicht sicher, aber ich würde vorsichtig sein, die native Alarmfunktion neu zu definieren. Zumindest ist es keine gute Programmierpraxis. –

Antwort

3

Unter der Annahme, dass die Code-behind während eines Update Refresh ausgeführt wird, könnte ther Ist eine schlechte Interaktion zwischen Ihrem EndRequest-Handler und Ihrer Code-Behind-Registrierung? topBar() sollte zweimal aufgerufen werden, einmal mit der Nachricht "Erfolgreich eingefügt" und einmal mit einem nicht definierten Parameter in EndRequest (es sei denn, die Nachrichtenvariable ist irgendwo definiert, die wir hier nicht sehen können).

Denken Sie auch daran, dass $('#alert') mehr als einen Artikel zurückgeben kann. Wenn topBar() mehr als einmal aufgerufen wird, ist das wahrscheinlich der Fall.

Wie so etwas für den Anfang zu machen, dass eine unbeabsichtigte Nebenwirkung zu verringern:

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

Das ist nicht die Frage der Endrequest und Register * Script nicht beheben beide Ausführung topbar(), aber das sollte halten Sie sie vor Konflikten, damit Sie sehen können, was besser läuft.

Geben Sie einen Versuch und lassen Sie uns wissen, wenn das die Dinge ändert.

+0

Was ist passiert, wenn es nicht funktioniert hat? Gar nichts? Sind Sie sicher, dass während des asynchronen Postbacks kein JavaScript-Fehler oder ein serverseitiger Fehler aufgetreten ist (der verhindert hätte, dass das Register * Script seine Nutzdaten ausgibt)? Wenn Sie Firebug verwenden, um einen Haltepunkt in der topBar() -Funktion festzulegen, wird diese Funktion überhaupt eingegeben, wenn es nicht richtig funktioniert? –

3

Mit Chrome und Firefox, das einzige Problem, das ich hatte, war die var alert den gleichen Namen wie der Anruf alert() zu sein.

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

Es ist möglich, dass Ihr body Tag nicht zum Zeitpunkt des Skripts geladen ausgeführt wird, die, dass die $(document.body) Referenz wäre leer bedeuten würde - die jquery leise die Warnung div scheitern würde hinzuzufügen. So oder so, es schadet nie, Ihre Anrufe in einem $(document).ready Ereignisse wickeln:

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

Hier ist ein voll funktionierendes Beispiel:

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

Bestätigte Funktion. Mein Code ruft UnFreezeScreen() auf. 'ScriptManager.RegisterStartupScript (BTN_Submit, BTN_Submit.GetType()," Schlüssel "," UnFreezeScreen(); ", True)' –

+0

Danke für diese Lösung, aber wenn ich weiß, wie kann ich das mit mehreren Aktionen arbeiten und Nachrichten verwenden Fälle aus dem Code gesendet? Wenn Sie Zeit haben, bitte aktualisieren oder jsFiddle ein kleines Beispiel..danke – hsobhy

3

Dies Ihre Frage nicht direkt beantworten, aber ist mehr gemeint passieren eine andere Technik zum Aufruf von Seitenmethoden ohne Verwendung von Update-Panels, aber direkt von jQuery.

dekorieren Sie Ihre Seite Methode (in der Teilklasse der Code-Behind) wie so (es statisch sein muss):

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

    return true; 
} 

Dann können Sie diese Seite Methode aufrufen rechts von jQuery $ Schnipsel-Methode:

Es ist sehr einfach und viel sauberer, dass versucht, Skripte zu registrieren. Sie müssen auch keinen Web-Service erstellen.

Dies ist ein großer Artikel:

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