2010-10-25 4 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, предоставляя там некоторые общие параметры (а именно authenticity_token, используемый для защиты от подделки в Rails). Все это отлично работало до попытки jQuery 1.4.3.

ответ

6

JQuery will only append parameters to the querystring for GET requests onlyno body for DELETE requests), так что это намеренное поведение в JQuery 1.4.3.

Однако с тех пор произошла смена (commit here), чтобы разрешить кузов для DELETE запросов в версии 1.4.4.

+0

Спасибо, Ник. Любые предложения об обходном пути? Учитывая ваш ответ, я попытался обновить 'settings.url' в обратном вызове' $ .ajaxSend() ', чтобы я добавлял значения строки запроса там для запросов DELETE; однако, похоже, что возвращаемое значение 'settings.url' не записывается для использования в jQuery 1.4.3, как в 1.3.2.Любые другие мысли по поводу этого, кроме того, чтобы вручную добавлять один и тот же параметр к каждому запросу во всем моем коде? –

+1

@Matt - Я думаю, что 1.4.4 скоро выйдет в качестве исправления для исправления ошибок, посмотрите на это совершение час назад, отметив его 1.4.4pre: http://github.com/jquery/jquery/commit/9b97599fa4d615a91d1605d9c664c50f576911ce Я бы сказал затяните несколько дней, возьмите 1.4.4 финала, и все готово. Вот сообщение в блоге: http://blog.jquery.com/2010/10/24/community-updates-2610/ –

+0

К сожалению, крайние сроки заставляют меня иметь дело с этим сейчас. Наверное, я обновляю вызовы inline, и рефакторинг через пару дней, когда это станет доступным. Большое спасибо за ваше понимание, вы всегда невероятно полезны здесь! –

1

Может ли это быть связано с параметром traditional? Это, как правило, относится к сложным типам, а не простой идентификатор параметра, но стоит проверить, если это не так:

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

Не похоже, чтобы этот вопрос здесь, спасибо, хотя! –

0

jQuery не предполагает, как иметь дело с контентом для DELETE. RFC также не указывает это.

Имелось несколько вопросов об этом. Были попытки реализовать поведение, как в других веб-инструментах, - для обработки содержимого DELETE в качестве части запроса URI.
Окончательное утверждение заключается в том, что разработчик решает, что делать с содержимым DELETE. jQuery предоставляет для этого достаточные инструменты. Для дополнительной проверки обсуждения в $.ajax DELETE request not passing data parameters вопрос.

О других методах, jQuery добавляет содержимое запроса к GET и HEAD. Проверьте значение rnoContent переменной в источнике jQuery.

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 Controller/Action

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); 
     } 
    } 
Смежные вопросы