2012-01-11 7 views
5

Oto niektóre javascript:Czy metoda post() jquery ma możliwość wywołania metody internetowej asp.net 3.5 webmethod?

$.ajax({ 
     type: "POST", 
     url: "default.aspx/GetDate", 
     contentType: "application/json; charset=utf-8", 
     data: {}, 
     dataType: "json", 
     success: function(result) { 
      alert(result.d); 
     } 
    }); 

Powyższa metoda działa jak bym się spodziewał i alarmy ciąg zwrócony z [WebMethod] zwanego GetDate w default.aspx

Ale kiedy używać:

$.post(
     "default.aspx/GetDate", 
     {}, 
     function(result) { 
      alert(result.d); 
     }, 
     "json" 
    ); 

Alert w tej metodzie sukces nigdy nie zostanie uruchomiony.

w Firebug widzę, że PO jest w zasadzie pracował - zwraca 200 OK
Ale w tym przypadku odpowiedź jest HTML całej strony default.aspx zamiast JSON zwracany, gdy używam $ .ajax() metoda.

EDYCJA: Nagłówki odpowiedzi i żądań przedstawione w firebug NIE są identyczne.

Z $ .ajax() ...

REQUEST: 
Accept application/json, text/javascript, */*; q=0.01 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Accept-Encoding gzip, deflate 
Accept-Language en-gb,en;q=0.5 
Connection keep-alive 
Content-Type application/json; charset=utf-8 
Cookie (removed) 
Host (removed) 
Referer (removed) 
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 
X-Requested-With XMLHttpRequest 

RESPONSE: 
Cache-Control private, max-age=0 
Content-Length 27 
Content-Type application/json; charset=utf-8 
Date Wed, 11 Jan 2012 12:36:56 GMT 
Server Microsoft-IIS/7.5 
X-Powered-By ASP.NET 

Z $ .post() ...

REQUEST: 
Accept application/json, text/javascript, */*; q=0.01 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Accept-Encoding gzip, deflate 
Accept-Language en-gb,en;q=0.5 
Connection keep-alive 
Cookie (removed) 
Host (removed) 
Referer (removed) 
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 
X-Requested-With XMLHttpRequest 

RESPONSE: 
Cache-Control private 
Content-Length 13815 
Content-Type text/html; charset=utf-8 
Date Wed, 11 Jan 2012 12:36:53 GMT 
Server Microsoft-IIS/7.5 
X-AspNet-Version 2.0.50727 
X-Powered-By ASP.NET 

Czy mogę używać z metody $ .post() dla tego, lub czy muszę użyć metody $ .ajax()?

+0

Czy jesteś pewien, że nagłówki żądań są takie same? Czy nagłówek 'Content-Type' nie jest różny? – lonesomeday

+0

Czy na pewno potrzebujesz połączenia z serwisem internetowym? Dosłownie właśnie zrobiłem to za pomocą $ .get i zwracając czysty HTML (bez nagłówków) i działało idealnie na moje potrzeby. Jeśli to pomoże, daj mi znać, a ja napiszę kod. – Archer

+0

Tyle razy, ile przeczytałem je @lonesomeday, twoje podejrzenie jest poprawne - "Content-Type: application/json; charset = utf-8" rzeczywiście znajduje się w nagłówkach żądań z wywołania $ .ajax(). – mikev2

Odpowiedz

3

To normalne. Podczas korzystania z $.post nie można ustawić wartości contentType: 'application/json' tak jak w przypadku $.ajax. A serwer oczekuje tego nagłówka. Więc zasadniczo nie można wywołać metody strony ASP.NET z $.post.

+0

Dzięki Darin - oto odpowiedź, której szukałem i myślę, że dostałeś się pierwszy. – mikev2

+0

Trochę późno po fakcie, ale chciałem dodać, że jest to częściowo niepoprawne. '$ .post()' ** can ** może być używane tak długo, jak długo wywoływane jest '$ .ajaxSetup()' przed skonfigurowaniem domyślnych parametrów żądania asynchronicznego. Zwykle konfiguruję te parametry na moich stronach wzorcowych lub widokach układu, więc kolejne wywołania, które wykonuję, zakończono sukcesem za pomocą '$ .post()'. – lsuarez

+0

Właśnie widziałem to @lthibodeaux - ale dzięki za publikację. Wygląda bardzo przydatny. – mikev2

3

Zakładam, że dzieje się tak, ponieważ twój kod serwera wymaga ustawienia nagłówka Content-Type. Domyślna implementacja $.post nie pozwala na to.

Jeśli jednak za każdym razem użyć AJAX w aplikacji trzeba ten nagłówek być obecny, można zmodyfikować $.post:

$.post = function (url, data, callback, type) { 
    if (jQuery.isFunction(data)) { 
     type = type || callback; 
     callback = data; 
     data = undefined; 
    } 

    return jQuery.ajax({ 
     type: 'POST', 
     url: url, 
     data: data, 
     success: callback, 
     dataType: type 
     contentType: "application/json; charset=utf-8" 
    }); 
}; 

z tym, wszystkie$.post połączenia będą mieć contentType zestawu. To może być dobry pomysł; może nie ...

+0

Dziękuję bardzo za poprawną odpowiedź i obejście problemu - nie użyję go, ponieważ widzę, dlaczego może to być problem. Dziękuję również za pomoc w zrozumieniu, dlaczego to się nie udawało. Nie mogłem znaleźć żadnej wzmianki o tym, że tak właśnie jest. EDYCJA: Niestety nie mogę oznaczyć dwóch postów jako odpowiedzi, a nawet nie mogę ci pomóc, ponieważ moja reputacja jest poniżej 15. Postaram się pamiętać, aby wrócić, gdy jest! – mikev2

+2

@ mikev2 Można również zdefiniować funkcję '$ .postMVC', powiedzmy, która zrobiłaby to samo, ale tylko wtedy, gdy chciałbyś ustawić' contentType'. To nie wpłynęłoby na normalne wywołania '$ .post'. – lonesomeday

+0

Teraz to brzmi jak dobry pomysł, który, jak sądzę, wykorzystam! Dzięki jeszcze raz :) – mikev2

Powiązane problemy