web-dev-qa-db-fra.com

asp.net ScriptManager PageMethods n'est pas défini

Je veux appeler des méthodes statiques côté serveur à partir de JS, donc je décide d'utiliser le contrôle ScriptManager sur mon site. J'ai donc une page maître, avec une telle structure:

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

Mais lorsque la page se charge, j'ai une exception JS - PageMethods n'est pas défini. Je suppose que cet objet sera créé implicitement afin que je puisse l'utiliser dans mon javascript.

11
igorGIS

Je comprends pourquoi l'objet PageMethod n'a pas été défini, car le composant ScriptManager est placé à côté du script qui utilise PageMethod, donc lorsque la page est rendue et le script exécuté, il n'y a pas de PageMethod pour le moment. J'ai donc besoin d'appeler getGiftFileUrl () lors d'un clic sur le bouton ou lors d'un événement de chargement de fenêtre, lorsque tous les scripts de la page sont prêts à être utilisés.

2
igorGIS

Pour utiliser PageMethods, vous devez suivre ces étapes:

  1. Vous devez utiliser ScriptManager et définir EnablePageMethods. (Tu l'as fait).
  2. Créez une méthode static dans votre code derrière et utilisez le [WebMethod] attribut.
  3. Appelez votre méthode en javascript comme vous devriez le faire en C # mais vous avez plus de paramètres à remplir, les callbacks sucess et error. (Tu l'as fait).

Avez-vous manqué l'une de ces étapes?

Edit: Je viens de réaliser que vous avez fait ceci:

            function getGiftFileUrl() {
            function OnSuccess...

Vous avez vos rappels à l'intérieur d'une fonction. Vous avez besoin de vos rappels comme celui-ci:

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

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

Et votre code derrière se terminera probablement par quelque chose comme ça:

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

Bonus: comme il s'agit d'une méthode static, vous ne pouvez pas utiliser this.Session["mySessionKey"], mais vous pouvez faire HttpContext.Current.Session["mySessionKey"].

24
Vitor Canova

Dans votre codebehind, créez cette méthode:

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

votre script js devrait aussi ressembler à ceci:

<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>
2
bastos.sergio