2010-02-04 60 views
13

我有一些jQuery的,看起來像這樣:如何設置jQuery ajax post的contentType,以便ASP.NET MVC可以讀取它?

$.ajax({ 
    type: "POST", 
    url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>", 
    contentType: "application/json", 
    success: refreshTransactions, 
    error: function(xhr, ajaxOptions, thrownError) { 
     alert("Failed to cancel subscription! Message:" + xhr.statusText); 
    } 
}); 

如果被調用的動作導致異常會最終得到通過在Global.asax的Application_Error拿起在那裏我有一些像這樣的代碼:

var ex = Server.GetLastError(); 
if (Request.ContentType.Contains("application/json")) 
{ 
    Response.StatusCode = 500; 
    Response.StatusDescription = ex.Message; 
    Response.TrySkipIisCustomErrors = true; 
} 
else 
{ 
    // some other way of handling errors ... 
} 

當我執行腳本執行post時,Request.ContentType始終是一個空字符串,因此不會碰到第一個if塊。是否還有其他值應該放在ajax「contentType」中?或者有另一種方法讓我告訴asp.net內容類型應該是「application/json」嗎?

澄清

我想達到的目標是通過異常消息回到阿賈克斯錯誤事件。目前,即使IF塊被繞過,錯誤事件正確地拋出一個警告框,但是該消息是「未找到」。

正如你所看到的,我正在嘗試將異常消息設置爲Response.StatusDescription,我相信ajax錯誤中的xhr.statusText設置爲。

回答

18

Accordiing這篇文章:http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/「jQuery在沒有數據時沒有正確設置指定的內容類型」

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "WebService.asmx/WebMethodName", 
    data: "{}", 
    dataType: "json" 
}); 
+1

這jQuery的1.4改變,現在它總是發送的內容類型...重要的一點:) http://api.jquery.com/jQuery.ajax/ – 2010-02-04 20:35:07

+0

我測試過這種方法出來,它的工作。我們在這裏使用jQuery 1.3.2。從Nick的描述看來,這聽起來像我的問題代碼應該與1.4一起工作。 – 2010-02-04 20:43:57

+1

這是正確的答案。在beforeSend中修改XHR對象的內容類型設置在某些瀏覽器中無法正常工作,並且該服務將返回XML而不是JSON。 – 2010-02-08 02:06:57

6

要在XmlHTTPRequest中設置自定義標頭,您需要在jQuery AJAX調用中使用beforeSend()選項功能。使用該功能設置其他標題,如jQuery API documenation中所述。

例子:

$.ajax({ 
    type: "POST", 
    url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>", 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader("Content-type", "application/json"); 
    }, 
    success: refreshTransactions, 
    error: function(xhr, ajaxOptions, thrownError) { 
     alert("Failed to cancel subscription! Message:" + xhr.statusText); 
    } 
    }); 
0

如果你總是對Ajax的錯誤返回JSON,那麼你可以使用以下方法來檢測,這是一個Ajax調用:

// jQuery sets a header of 'x-requested-with' in all requests 
      string[] ajaxHeader = httpRequest.Headers.GetValues("x-requested-with"); 
      if (ajaxHeader != null && ajaxHeader.Length > 0) 
      { 
       return ajaxHeader[0].Equals("XMLHttpRequest", StringComparison.InvariantCultureIgnoreCase); 
      } 
      return false; 
0

將其用於默認內容類型。

$ .ajaxSetup({ 的contentType: 「應用程序/ JSON;字符集= UTF-8」, });

相關問題