2012-01-11 22 views
5

İşte bazı javascript var:Bir asp.net 3.5 webmethod çağıran jquery's post() yöntemi midir?

Ben beklenir ve uyarılar dize default.aspx

yılında [WebMethod] denilen GetDate dönen Ama kullandığınızda yukarıdaki yöntem çalışır

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

:

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

Bu başarı yöntemindeki uyarı asla yanmaz.

Ben POST temelde çalıştı görebilirsiniz kundakçı olarak

- döndürür 200 OK
Ama $ .ajax kullandığınızda bu durumda tepki JSON döndü tamamı yerine default.aspx sayfasının HTML() yöntem.

DÜZENLEME:
Firebugda gösterilen yanıt ve istek başlıkları aynı DEĞİLDİR. $ .ajax() ile

...

$ .post() ile
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 

...

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 

Bunun için $ .post() yöntemini kullanabilir miyim, veya $ .ajax() yöntemini kullanmalı mıyım?

+0

Siz * emin * istek başlıkları aynı mıdır? İçerik Türü 'başlığı değişmiyor mu? – lonesomeday

+0

Kesinlikle bir web servisini çağırmanız mı gerekiyor? Ben tam anlamıyla bunu sadece $ .get kullanarak ve saf HTML (başlıkları olmadan) döndürerek yaptım ve ihtiyaçları için mükemmel çalıştı. Eğer bu yardımcı olacaksa bana haber verin ve bazı kodları yayınlayacağım. – Archer

+0

Onları okuduğum kadar çok kez, şüphe duyduğunuz şey doğru - "Content-Type: application/json; charset = utf-8" gerçekten $ .ajax() çağrısından İstek Başlıkları'nda yer alıyor. – mikev2

cevap

3

Bu normaldir. $.post kullandığınızda, $.ajax ile contentType: 'application/json' ayarlayamazsınız. Ve sunucu bu başlığı bekliyor. Yani temel olarak $.post ile bir ASP.NET sayfa yöntemini çağıramazsınız.

+0

Teşekkürler Darin - aradığım cevap bu, ve sanırım önce sen aldın. – mikev2

+0

Aslında biraz geç sonra, ama bunun kısmen yanlış olduğunu eklemek istedim. '$ .post()' **, $ .ajaxSetup() 'ın çağrısının, async isteğinin varsayılan parametrelerini yapılandırmadan önce yapıldığı sürece kullanılabilir. Bu parametreleri ana sayfalar veya mizanpaj görünümlerimde zaten yapılandırmaya eğilimliyim, bu yüzden yaptığım sonraki aramalar $ .post() 'kullanarak başarılı oluyor. – lsuarez

+0

Sadece bu @lthibodeaux'u gördüm - ancak gönderdiğiniz için teşekkürler. Çok kullanışlı görünüyor. – mikev2

3

Bunun sebebi, sunucu kodunuzun Content-Type başlığının ayarlanmasını gerektirmesidir. $.post'un varsayılan uygulaması buna izin vermez. Ancak, uygulamanızda AJAX kullanmak her zaman mevcut olması bu başlık gerekiyorsa

, sen $.post değiştirebilir:

$.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" 
    }); 
}; 
Bununla

, tüm$.post çağrılar contentType setine sahip olacak. Bu iyi bir fikir olabilir; olmayabilir ...

+0

Doğru cevabınız ve geçici çözümünüz için çok teşekkürler - Neden kullanamayacağımı, bunun neden sorun olabileceğini de görüyorum. Ayrıca neden başarısız olduğunu anlamamda bana yardımcı olduğunuz için teşekkürler. Bu durumun herhangi bir yerde olduğunu söyleyemedim. EDIT: Ne yazık ki iki yazıyı cevap olarak işaretleyemiyorum, ve benim itibarımın 15'in altında olduğumuzu da sizleri bir daha alamıyorum. Ne zaman geldiğimi hatırlamaya çalışacağım! – mikev2

+2

@ mikev2 Ayrıca, bir '$ .postMVC' işlevini de tanımlayabilirsiniz, aynısını yapar, ancak yalnızca 'contentType' ayarını istediğinizde. Bu normal '$ .post' çağrılarını etkilemez. – lonesomeday

+0

Şimdi _that_ iyi bir fikir gibi geliyor, sanırım kullanacağım! Tekrar teşekkürler :) – mikev2