2010-10-25 67 views
9

我剛剛從jQuery 1.3.2更新到1.4.3,並且在發出AJAX DELETE請求時看到一些新行爲。由於某種原因,傳遞給我的data參數中的數據沒有被髮送到服務器。例如:

$.ajax({ 
    url: '/example', 
    data: {id: 12}, 
    type: 'DELETE' 
}); 

最終發送一個DELETE請求到/example,沒有額外的數據。但是,這種類型的呼叫通過參數就好了:

$.ajax({ 
    url: '/example?id=12', 
    type: 'DELETE' 
}); 

有沒有其他人看過類似的行爲?是否有這個原因不再有效的原因(即:是設計還是錯誤)?有關如何讓它工作的任何建議?

此外,如果有人想知道爲什麼我不想簡單地將參數作爲URL字符串的一部分傳遞,這是因爲我最終試圖使用$.ajaxSetup回調,在那裏提供了一些常規參數(即用於防止在Rails中僞造的參數authenticity_token)。在嘗試jQuery 1.4.3之前,這一切都運行良好。

回答

6

jQuery的will only append parameters to the querystring for GET requests only(和no body for DELETE requests),所以這是jQuery的1.4.3故意行爲。

但是,自此之後(commit here)發生了變化,允許在1.4.4版本中爲DELETE請求提供正文。

+0

謝謝,尼克。有關解決方法的任何建議?鑑於您的迴應,我試圖更新'$ .ajaxSend()'回調中的'settings.url',以便在DELETE請求中追加查詢字符串值;然而,它看起來像'settings.url'的返回值沒有捕獲用於jQuery 1.4.3,因爲它在1.3.2中。任何其他的想法處理這個,除了手動將相同的參數附加到我的代碼中的每一個單一的請求? – 2010-10-25 21:43:18

+1

@Matt - 我覺得1.4.4很快就會發布bug修正版,看看這個提交一個小時之前的標籤1.4.4pre:http://github.com/jquery/jquery/commit/9b97599fa4d615a91d1605d9c664c50f576911ce我會說緊緊抓住幾天,抓住1.4.4的最後一刻,你們全都準備好了。這裏有一篇關於它的博客文章:http://blog.jquery.com/2010/10/24/community-updates-2610/ – 2010-10-25 21:48:56

+0

不幸的截止日期迫使我現在處理這個問題。我想現在我會更新內聯的電話,並在幾天內重新構建這些電話。非常感謝您的洞察力,您在這裏總是非常有幫助! – 2010-10-25 21:52:32

1

這可能與traditional參數有關嗎?它通常涉及到複雜的類型,而不是一個簡單的ID參數,但值得一試,如果不是這種情況:

$.ajax({ 
    url: '/example', 
    data: { id: someValue }, 
    traditional: true, 
    type: 'DELETE' 
}); 
+0

不看是這裏的問題,謝謝您的好意! – 2010-10-25 21:48:01

0

jQuery並不假定如何處理DELETE請求的內容。 RFC也沒有指定這個。

關於它的問題很少。曾嘗試像其他網絡工具一樣實施行爲 - 將DELETE內容視爲URI的查詢部分。
最後的說法是開發人員決定如何處理DELETE內容。 jQuery爲此提供了足夠的工具。 有關更多檢查$.ajax DELETE request not passing data parameters問題的討論。

關於其他方法,jQuery將請求內容添加到GETHEAD。在jQuery源代碼中檢查rnoContent變量。

0

這爲我工作:

jQuery的

$("#DeleUser").click(function() { 
    $.ajax({ type: "DELETE", url: userController + "DeleteUser/" + $("#UserId").val() + "?UserPhoto=" + $("#UserPhoto").val() }) 
    .done(function (data) { 
     $('#MsgUser').text("User deleted"); 
     $("#User").trigger("reset"); 
    }) 
    .fail(function (response, status, error) { 
     $('#MsgUser').text(error); 
    }); 
}); 

的WebAPI控制器/動作

public IHttpActionResult DeleteUser(int id) 
    { 
     try 
     { 
      var request = HttpContext.Current.Request; 
      string userPhoto = request.QueryString["UserPhoto"]; 
      Users user = new Users(); 
      user.UserId = id; 
      user.Delete(ConfigurationManager.ConnectionStrings["DBName"].ConnectionString, id); 
      if (File.Exists(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["PhotosPath"]) + userPhoto)) 
      File.Delete(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["PhotosPath"]) + userPhoto); 
      return Ok(); 
     } 
     catch (Exception e) 
     { 
      HttpResponseMessage responseMessage = new HttpResponseMessage(); 
      responseMessage.StatusCode = HttpStatusCode.InternalServerError; 
      responseMessage.ReasonPhrase = "Exception: " + e.Message; 
      throw new HttpResponseException(responseMessage); 
     } 
    }