2012-01-11 54 views
5

下面是一些javascript:jquery的post()方法能夠調用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); 
     } 
    }); 

上述方法的工作原理我希望和警報字符串從[的WebMethod]所謂GETDATE Default.aspx中

返回但是當我使用:

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

這種成功方法中的警報從不會引發火災。

在Firebug我可以看到POST已基本工作 - 它會返回200 OK
但是,在這種情況下,響應是整個Default.aspx頁面的HTML而不是JSON回來,當我使用$阿賈克斯() 方法。

編輯:在螢火所示
的響應和請求頭是不相同的。

隨着$。阿賈克斯()...

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 

我可以使用的$。員額()方法用於此,還是必須使用$ .ajax()方法?

+0

你確定*請求頭是相同的? 「Content-Type」頭文件不會改變嗎? – lonesomeday 2012-01-11 13:24:00

+0

您確實需要撥打網絡服務嗎?我剛剛使用$ .get完成了這個工作,並返回了純HTML(沒有頭文件),它完全滿足我的需求。如果這會幫助,然後讓我知道,我會張貼一些代碼。 – Archer 2012-01-11 13:27:49

+0

@lonesomeday讀過它們的次數很多,您的懷疑是正確的 - 「Content-Type:application/json; charset = utf-8」確實在$ .ajax()調用的Request Headers中。 – mikev2 2012-01-11 13:32:14

回答

3

這很正常。當您使用$.post時,您不能像設置$.ajax那樣設置contentType: 'application/json'。服務器期望這個頭。所以基本上你不能用$.post調用ASP.NET頁面方法。

+0

謝謝達林 - 這是我正在尋找的答案,我認爲你首先得到了答案。 – mikev2 2012-01-11 13:50:54

+0

事後有點晚了,但想補充說這是部分錯誤。只要在爲異步請求配置默認參數之前調用'$ .ajaxSetup()',就可以使用$ .post()**。我傾向於在主頁面或佈局視圖中配置這些參數,所以後續調用使用'$ .post()'成功。 – lsuarez 2012-05-12 08:48:03

+0

我剛纔看到這個@lthibodeaux - 但感謝發佈。它看起來非常有用。 – mikev2 2012-12-05 12:04:38

3

我推測這是因爲您的服務器端代碼需要設置Content-Type標頭。 $.post的默認實現不允許這樣做。

但是,如果你在你的應用程序中使用AJAX每一次你需要這個頭是存在,你可以修改$.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" 
    }); 
}; 

有了這個,所有$.post通話將contentType集。這可能是一個好主意;它可能不會...

+0

非常感謝您的正確答案和解決方法 - 我不會使用它,因爲可以看出它爲什麼會成爲問題。也感謝幫助我理解它失敗的原因。我無法在任何地方發現這種情況。編輯:不幸的是,我不能標記兩個職位作爲答案,甚至不能upvote你,因爲我的聲譽低於15。我會盡量記得回來的時候! – mikev2 2012-01-11 13:53:51

+2

@ mikev2你也可以定義一個'$ .postMVC'函數,比如說,它可以做同樣的事情,但只有當你想要設置contentType時。這不會影響正常的'$ .post'調用。 – lonesomeday 2012-01-11 13:55:03

+0

現在_that_聽起來像個好主意,我想我會用它!再次感謝 :) – mikev2 2012-01-11 13:57:53