我刚刚从jQuery 1.3.2更新到1.4.3,我在制作AJAX DELETE请求时看到了一些新的行为。出于某种原因,我的data
参数中传递的数据未发送到服务器。例如:
$.ajax({
url: '/example',
data: {id: 12},
type: 'DELETE'
});
结束向/example
发送DELETE请求而没有其他数据。但是,这种类型的调用传递参数就好了:
$.ajax({
url: '/example?id=12',
type: 'DELETE'
});
还有其他人见过类似的行为吗?有没有理由不再工作(即:是设计还是错误)?有关如何使其正常工作的任何建议吗?
此外,如果有人想知道为什么我不想简单地将参数作为URL字符串的一部分传递,那是因为我最终尝试使用$.ajaxSetup
回调,在那里提供一些通用参数(即用于防止在Rails中伪造的authenticity_token
参数)。在尝试jQuery 1.4.3之前,这一切都运行良好。
答案 0 :(得分: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
个请求提供正文。
答案 1 :(得分:1)
这可能与traditional
参数有关吗?它通常与复杂类型有关,而不是简单的id参数,但值得检查是否不是这种情况:
$.ajax({
url: '/example',
data: { id: someValue },
traditional: true,
type: 'DELETE'
});
答案 2 :(得分:0)
jQuery没有假设如何处理DELETE
请求的内容。 RFC也未指定此内容。
关于它的问题很少。有人试图像在其他网络工具中那样实现行为 - 将DELETE
内容视为URI的查询部分
最后声明是开发人员决定如何处理DELETE内容。 jQuery为此提供了足够的工具。
有关$.ajax DELETE request not passing data parameters问题中的更多检查讨论。
关于其他方法,jQuery向GET
和HEAD
添加了请求内容。检查jQuery源代码中的rnoContent
变量。
答案 3 :(得分: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);
}
}