web-dev-qa-db-fra.com

Appelez ASP.NET PageMethod/WebMethod avec jQuery - renvoie la page entière

jQuery 1.3.2, ASP.NET 2.0. Passer un appel AJAX à un PageMethod (WebMethod) renvoie la page entière/entière au lieu de la seule réponse. Un point d'arrêt sur la méthode de la page indique qu'il ne sera jamais touché. J'ai l'attribut [WebMethod] sur ma méthode, et il est public statique, renvoie une chaîne et n'accepte aucun paramètre. J'ai même essayé d'ajouter [ScriptService] au sommet de ma classe pour voir si cela aidait, mais cela ne fonctionnait pas.

J'ai vu ce message Jquery AJAX avec ASP.NET WebMethod renvoyant la page entière qui présentait les mêmes symptômes, mais le problème persiste. J'ai lu http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/ et j'ai l'impression de suivre cela jusqu'au bout , mais toujours pas de chance.

L'appel jQuery que je passe est le suivant:

jQuery.ajax({
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: '{}',
    dataType: 'json',
    url: 'MyPage.aspx/SomePageMethod',
    success: function(result){
        alert(result);
    }
});

Les en-têtes de demande/réponse, selon Firebug dans FF3, sont les suivants

Response Headers
Server  ASP.NET Development Server/8.0.0.0
Date    Tue, 24 Feb 2009 18:58:27 GMT
X-AspNet-Version    2.0.50727
Cache-Control   private
Content-Type    text/html; charset=utf-8
Content-Length  108558
Connection  Close

Request Headers 
Host    localhost:2624
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
Accept  application/json, text/javascript, */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  300
Connection  keep-alive
Content-Type    application/json; charset=utf-8
X-Requested-With XMLHttpRequest
Referer http://localhost:2624/MyApp/MyPage.aspx
Content-Length  2
Cookie  ASP.NET_SessionId=g1idhx55b5awyi55fvorj055; 

J'ai ajouté un ScriptManager à ma page uniquement pour vérifier si cela aide, mais pas de chance là-bas.

Aucune suggestion?

35
Matt

Savez-vous que les méthodes de page fonctionnent correctement? Si vous utilisez le ScriptManager, fonctionnent-ils?

Il semble que vous manquiez peut-être une entrée web.config . Plus précisément la section HttpModules.

27
Dave Ward

Il me manquait une ligne de mon web.config:

<system.web>
  <httpModules>
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </httpModules>
</system.web>
23
adam seabridge

J'ai rencontré ce problème à nouveau aujourd'hui pour une autre raison: j'avais mal orthographié "application" dans 

contentType: 'application/json'

Et obtenait une réponse d'une page entière au lieu d'un appel à WebMethod.

13
Matt

Si vous avez essayé tout cela et que vous obtenez toujours la page entière renvoyée par votre méthode de pagemethod, vous pouvez vous assurer que vous n'utilisez pas d'URL conviviales . Si vous les utilisez, cette astuce peut vous aider.

Ajoutez cette ligne sur votre script js avant de faire l'appel:

PageMethods.set_path(PageMethods.get_path() + '.aspx');
6
Marvin Zumbado

Jeter ceci ici comme note de côté. Je recevais cette erreur en raison de la longueur de mes variables de chaîne dans ma chaîne HTML et le site Web sur lequel je m'appelais ajax s'appelait ainsi.

loc = (loc.substr(loc.length - 1, 1) == "/") ? loc + "Default.aspx" : loc;
        $.ajax({
            type: "POST",
            url: loc + "/" + methodName,
            data: "{" + args + "}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: onSuccess,
            error: onFail
        });

Il n'était pas capable d'extraire le lien .aspx correctement, aussi je me suis contenté de coder ma page Web en dur au lieu d'utiliser le loc var.

1
Dan Simon

La plupart des scénarios ajax que j'ai vus devraient vraiment appeler un service Web ou un gestionnaire de script distinct, pas une page. C'est très facile à faire en .net 3-5, pas si facile en 2-0. Même après avoir compris (si) comment ne pas charger la page entière, voici des raisons de ne pas appeler une méthode de page:

1) La méthode de la page peut charger moins de choses qu'un chargement de page complète, mais bien plus que ce dont vous avez besoin pour un simple appel ajax . 2) Une séparation des responsabilités moche. La page est probablement responsable de la bonne mise en page, pas de la logique que vous utilisez dans la méthode ajax.
3) Peut-être avez-vous besoin d'un état de session, mais celui-ci devrait toujours être disponible. 

Je suis actuellement en train de mettre à jour mes connaissances sur ce sujet ... Je vais chercher une bonne réponse à cette question dans ce fil, ou j'en posterai une la semaine prochaine. Voici la direction que je me dirige 

1) Envoyez le fichier JSON du serveur au client et utilisez javascript pour mettre à jour votre page. - Divers cadres facilitent la production de JSON à partir du serveur Web.
2) JQuery rend les appels ajax, la manipulation json et le formatage du client amusants, au lieu de douloureux. 

0

Après presque deux heures et après avoir tout essayé, j'ai finalement résolu le problème. @ Le commentaire de Marvin Zumbado m'a aidé. Il me manquait le .aspx de mon URL. Je sais que ce n'est pas mon meilleur moment en tant que programmeur!

0
Sotiris Zegiannis