2013-05-27 13 views
10

Desidero richiamare i metodi statici sul lato server da JS, quindi decido di utilizzare il controllo ScriptManager sul mio sito. Così ho una pagina master, con tale struttura:asp.net ScriptManager PageMethods non è definito

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

Ma quando la pagina viene caricata, ho un'eccezione JS - PageMethods non è definito. Suppongo che l'oggetto verrà creato implicito, quindi posso usarlo nel mio javascript.

risposta

2

ho capire perché l'oggetto è stato PageMethod undefinded, perché componente ScriptManager collocato accanto da lo script che usa PageMethod, così quando la pagina viene renderizzata e lo script eseguito, non c'è PageMethod in questo momento. Quindi ho bisogno di chiamare getGiftFileUrl() sul clic del pulsante o sull'evento di caricamento della finestra, quando tutti gli script sulla pagina sono pronti per l'uso.

+2

qualsiasi campione finale con soluzione? o contrassegnata con @vitorcanova risposta. – Kiquenet

21

Per utilizzare PageMethods è necessario attenersi alla seguente procedura:

  1. È necessario utilizzare ScriptManager e impostare EnablePageMethods. (L'hai fatto).
  2. Creare un metodo static nel codice dietro e utilizzare l'attributo [WebMethod].
  3. Chiamate il metodo in javascript come dovreste fare in C# ma avete più parametri da riempire, i callback sucess e error. (L'hai fatto).

Ti sei perso uno di questi passaggi?

Edit: appena realizzato avete fatto queste cose:

  function getGiftFileUrl() { 
      function OnSuccess... 

Hai vostra callback all'interno di una funzione. È necessario il vostro callback come questo:

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

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

E si codice dietro probabilmente finirà in qualcosa di simile:

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

Bonus: Dal momento che si tratta di un metodo di static non è possibile utilizzare this.Session["mySessionKey"], ma si può fare HttpContext.Current.Session["mySessionKey"].

+0

Forse WebMethod-PageMethods e JSON. – Kiquenet

+0

Questa avrebbe dovuto essere la risposta accettata – Fandango68

2

Nella tua codebehind creare questo metodo:

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

lo script js dovrebbe assomigliare anche questo:

<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

Manca la chiamata effettiva a getGiftFileUrl() dal controllo ASP – Fandango68

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

Will lavoro di 100%.