2009-02-24 9 views
32

jQuery 1.3.2, ASP.NET 2.0. Faire un appel AJAX à un PageMethod (WebMethod) renvoie la page complète/entière au lieu de simplement la réponse. Un point d'arrêt sur la méthode de la page montre qu'il ne sera jamais touché. J'ai l'attribut [WebMethod] sur ma méthode, et est public statique, retourne une chaîne et n'accepte aucun paramètre. J'ai même essayé d'ajouter [ScriptService] en haut de ma classe pour voir si cela a aidé, mais ce n'est pas le cas.Appel ASP.NET PageMethod/WebMethod avec jQuery - retourne la page entière

J'ai vu cet article Jquery AJAX with ASP.NET WebMethod Returning Entire Page qui avait mes mêmes symptômes, mais j'ai toujours un problème. J'ai lu http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/ et je me sens comme je suis ce qui suit pour le T, mais toujours pas de chance.

L'appel jQuery je fais est:

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

la demande/têtes de réponse, selon Firebug dans FF3, sont les suivantes

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é à mon ScriptManager page juste pour des coups de pied pour voir si cela a aidé, mais pas de chance là-bas.

Des suggestions?

Répondre

27

Savez-vous que les méthodes de page fonctionnent correctement? Si vous utilisez le ScriptManager, cela fonctionne-t-il?

Il semble que vous puissiez être absent a web.config entry. Plus précisément, la section HttpModules.

+0

Dangit! Je savais que ça allait être quelque chose de facile. Je suppose que je suppose que tout configs qui seraient nécessaires aurait été traitées par VS quand je laissai tomber dans un ScriptManager (ce qui était la raison pour laquelle je l'ai ajouté, parce que je savais que vous ne * besoin * il. Merci! – Matt

+1

Been recherche ce problème pour une heure + et web.config et le ScriptModule httpModule a fini par être le coupable. Merci! –

+2

Salut Dave. par @Surya, ce lien ne semble pas fonctionner plus. – Matt

0

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

1) La méthode page peut charger moins de choses qu'une charge de page complète, mais toujours beaucoup plus que vous avez besoin d'un simple appel ajax. 2) Moche séparation des responsabilités. La page est probablement responsable de jolies choses, pas la logique que vous utilisez dans la méthode ajax.
3) Peut-être avez-vous besoin d'un état de session, mais cela devrait être disponible.

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

1) Envoyer JSON du serveur au client, et utiliser javascript pour mettre à jour votre page. - une variété de frameworks facilite la production de JSON depuis le serveur web.
2) JQuery rend les appels ajax, la gestion de json et le formatage de client amusants, au lieu de douloureux.

+0

Voilà ce qu'est une « méthode de page » est. Il est juste un moyen pratique d'écrire un service Web qui retourne JSON. –

+0

1) Il est encore juste un async appel javascript. Un PageMethod, également connu sous le nom d'une méthode statique publique décorée avec un attribut WebMethod dans votre code, est simplement du sucre syntaxique pour dire à ASP.NET de répondre aux requêtes POST contre cette adresse avec une réponse du code. – Matt

+0

(suite) La réponse est encore juste JSON, et très petite. Pas de viewstate, même. 2) Comment savez-vous quelle logique j'utilise dans la méthode de la page? Dans mon cas, il s'agit simplement de saisir des données qui sont en fait spécifiques à cette page, mais qui n'étaient pas disponibles lors du chargement de la page. 3) Je n'ai pas eu besoin de session, mais l'appel asynchrone – Matt

23

je manque 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> 
+9

Adam Seabridge, où que vous soyez maintenant, je vous aime. –

+0

Cette solution présente une nouvelle erreur: Erreur HTTP 500,22 - Erreur interne du serveur –

13

j'ai rencontré ce problème encore aujourd'hui pour une autre raison: j'avais mal orthographié « application » dans

contentType: 'application/json' 

Et devenais une réponse pleine page au lieu d'un appel à WebMethod.

+0

Misspell d'application pour moi aussi. Merci pour le conseil. –

1

En jetant ceci dehors comme note latérale.Je recevais cette erreur en raison de la longueur de mes variables de chaîne dans ma chaîne HTML et le site Web que j'ai utilisé pour obtenir mon ajax appelé ressemblait à ceci.

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'a pas été capable d'extraire correctement le lien .aspx, donc je viens Hardcoded ma page web au lieu d'utiliser la loc var.

3

Si vous avez essayé tout cela et toujours obtenir la page entière de votre retour pagemethod, vous pouvez vous assurer que vous n'utilisez pas urls sympathiques. Si vous utilisez eux, cette astuce peut vous aider à

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

PageMethods.set_path(PageMethods.get_path() + '.aspx'); 
0

Après près de deux heures et après avoir tout essayé je me suis finalement résolu. 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!