$ .ajax игнорирует параметр данных для запросов DELETE - PullRequest
9 голосов
/ 26 октября 2010

Я только что обновил с 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.

Ответы [ 4 ]

6 голосов
/ 26 октября 2010

jQuery будет добавлять параметры в строку запроса только для GET запросов только без тела для DELETE запросов ), поэтому это намеренное поведение в jQuery 1.4.3 .

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

1 голос
/ 26 октября 2010

Может ли это быть связано с параметром traditional? Обычно это относится к сложным типам, а не к простому параметру id, но стоит проверить, если это не так:

$.ajax({
    url: '/example',
    data: { id: someValue },
    traditional: true,
    type: 'DELETE'
});
0 голосов
/ 12 июня 2014

Это сработало для меня:

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);
        }
    }
0 голосов
/ 18 сентября 2013

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

Было несколько вопросов по этому поводу. Были попытки реализовать поведение, как и в других веб-инструментах - обрабатывать контент DELETE как часть запроса URI.
Последнее утверждение заключается в том, что разработчик решает, что делать с УДАЛЕННЫМ контентом . JQuery предоставляет достаточно инструментов для этого. Более подробное обсуждение см. В запросе DELETE $. Ajax без передачи параметров данных issue.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...