2013-05-27 9 views
10

Ich möchte statische serverseitige Methoden von JS aufrufen, so entscheide ich mich, ScriptManager-Steuerelement auf meiner Website zu verwenden. So habe ich eine Masterseite, mit einer solchen Struktur:asp.net ScriptManager PageMethods ist undefined

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TopLevelMasterPage.Master.cs" 
    Inherits="Likedrive.MasterPages.TopLevelMasterPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:fb="http://ogp.me/ns/fb#"> 

<head runat="server"> 
    <title></title> 
     <script type="text/javascript"> 
      function getGiftFileUrl() { 
       function OnSuccess(response) { 
        alert(response); 
       } 
       function OnError(error) { 
        alert(error); 
       } 

       PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSuccess, OnError); 
      } 

      getGiftFileUrl(); 

     </script> 
    </asp:ContentPlaceHolder> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManagerMain" 
      runat="server" 
      EnablePageMethods="true" 
      ScriptMode="Release" 
      LoadScriptsBeforeUI="true"> 
    </asp:ScriptManager> 
    <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
    </asp:ContentPlaceHolder> 
    </form> 
</body> 
</html> 

Aber wenn Seite geladen ist, ich habe eine JS Ausnahme - Pagemethods ist nicht definiert. Ich vermute, dass das Objekt implizit erstellt wird, damit ich es in meinem Javascript verwenden kann.

Antwort

2

Ich habe erkennen, warum das Objekt Pagemethod wurde undefinierten, weil Script Komponente nächsten platziert aus das Skript, das PageMethod verwendet, also wenn die Seite gerendert und das Skript ausgeführt wird, gibt es in diesem Moment keine PageMethod. Also muss ich getGiftFileUrl() beim Klicken auf die Schaltfläche oder beim Laden des Fensters aufrufen, wenn alle Skripte auf der Seite bereit sind.

+2

jede endgültige Probe mit Lösung? oder markiert @vitorcanova Antwort. – Kiquenet

21

Pagemethods nutzen zu können, müssen die folgenden Schritte ausführen:

  1. Sie müssen ScriptManager verwenden und EnablePageMethods. (Du machtest).
  2. Erstellen Sie eine static Methode in Ihrem Code hinter und verwenden Sie das [WebMethod] Attribut.
  3. Rufen Sie Methode in Javascript, wie Sie in C# tun sollten, aber Sie haben mehr Parameter füllen, die sucess und error Rückrufe. (Du machtest).

Haben Sie einen dieser Schritte übersehen?

Edit: einfach realisiert man dies tut:

  function getGiftFileUrl() { 
      function OnSuccess... 

Sie haben Ihre Rückrufe innerhalb einer Funktion. Sie müssen Ihr Rückrufe wie folgt aus:

  function OnSuccess(response) { 
       alert(response); 
      } 
      function OnError(error) { 
       alert(error); 
      } 

PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSuccess, OnError); 

Und Sie hinter Code wahrscheinlich in so etwas wie das enden wird:

[WebMethod] 
public static string GetGiftFileUrl(string name, int width, int height) 
{ 
    //... work 
    return "the url you expected"; 
} 

Bonus: Da es sich um eine static Methode ist, dass Sie nicht this.Session["mySessionKey"] verwenden können, aber Sie kann HttpContext.Current.Session["mySessionKey"] tun.

+0

Vielleicht WebMethod-PageMethods und JSON. – Kiquenet

+0

Dies sollte die angenommene Antwort gewesen sein – Fandango68

2

In Ihrem Code-Behind erstellen diese Methode:

[WebMethod] 
public static void GetGiftFileUrl(string value1, int value2, int value3) 
{ 
    // Do Stuff 
} 

Ihre js Skript sollte dies auch aussehen:

<script type="text/javascript"> 
    function getGiftFileUrl() { 
     PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSucceeded, OnFailed); 
    } 

    function OnSucceeded(response) { 
     alert(response); 
    } 
    function OnFailed(error) { 
     alert(error); 
    } 


    getGiftFileUrl(); 
</script> 
+0

Sie vermissen den tatsächlichen Aufruf von getGiftFileUrl() aus dem ASP-Steuerelement – Fandango68

-3
<script type="text/javascript"> 
     function Generate() 
     {    
      var result = PageMethods.GenerateOTP(your parameter, function (response) 
      { 
       alert(response); 
      }); 
     } 
</script> 

Will 100% arbeiten.

Verwandte Themen