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?
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.
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>
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.
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');
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.
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.
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!