2010-10-25 13 views
9

Acabo de actualizar de jQuery 1.3.2 a 1.4.3, y estoy viendo un nuevo comportamiento al hacer solicitudes AJAX DELETE. Por algún motivo, los datos que se pasan en mi parámetro data no se envían al servidor. Por ejemplo:

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

termina el envío de una solicitud DELETE a /example sin datos adicionales. Sin embargo, este tipo de llamada pasa los parámetros muy bien:

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

¿Alguien ha visto comportamiento similar? ¿Hay alguna razón por la cual esto ya no funciona (es decir, es por diseño o es un error)? ¿Alguna sugerencia sobre cómo hacerlo funcionar?

Además, en caso de que alguien se pregunte por qué no quiero simplemente pasar los parámetros como parte de la cadena URL, es porque en última instancia estoy intentando usar la devolución de llamada $.ajaxSetup, proporcionando algunos parámetros generales allí (es decir, authenticity_token parámetro utilizado para proteger contra la falsificación en Rails). Todo funcionó bien antes de probar jQuery 1.4.3.

Respuesta

6

jQuery will only append parameters to the querystring for GET requests only (y no body for DELETE requests), por lo que este es un comportamiento intencional en jQuery 1.4.3.

Sin embargo, hay un cambio desde entonces (commit here) para permitir un cuerpo para las solicitudes DELETE en la versión 1.4.4.

+0

Gracias, Nick. ¿Alguna sugerencia sobre una solución alternativa? Dada su respuesta, intenté actualizar 'settings.url' en la devolución de llamada' $ .ajaxSend() 'de manera que anexe los valores de la cadena de consulta para las solicitudes DELETE; sin embargo, parece que el valor devuelto de 'settings.url' no se está capturando para su uso en jQuery 1.4.3 como se muestra en 1.3.2.¿Alguna otra idea sobre cómo lidiar con esto, aparte de agregar manualmente el mismo parámetro a cada solicitud en cualquier lugar de mi código? –

+1

@Matt - Creo que 1.4.4 saldrá muy pronto como una versión de corrección de errores, mira este compromiso hace una hora etiquetándolo 1.4.4pre: http://github.com/jquery/jquery/commit/9b97599fa4d615a91d1605d9c664c50f576911ce Yo diría espere unos días, obtenga 1.4.4 final y ya está todo listo. Aquí hay una publicación en el blog: http://blog.jquery.com/2010/10/24/community-updates-2610/ –

+0

Lamentablemente, los plazos me obligan a lidiar con esto ahora. Supongo que actualizaré las llamadas en línea por ahora, y refactorizaré en un par de días cuando esté disponible. Muchas gracias por su visión, ¡siempre son increíblemente útiles aquí! –

1

¿Esto podría estar relacionado con el parámetro traditional? Por lo general, se refiere a tipos complejos y no un parámetro id simple pero vale la pena comprobar si este no es el caso:

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

No parece ser el problema aquí, aunque gracias! –

0

jQuery no supone cómo tratar el contenido para la solicitud DELETE. El RFC tampoco especifica esto.

Hubo algunos problemas al respecto. Hubo intentos de implementar el comportamiento como en otras herramientas web: para tratar el contenido DELETE como una parte de la consulta del URI.
La declaración final es que el desarrollador decide qué hacer con el contenido DELETE. jQuery proporciona suficientes herramientas para eso. Para obtener más información sobre el control en el número $.ajax DELETE request not passing data parameters.

Sobre otros métodos, jQuery agrega un contenido de solicitud a GET y HEAD. Compruebe la variable rnoContent en la fuente de jQuery.

0

Esto funcionó para mí:

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); 
    }); 
}); 

controlador WebAPI/Acción

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); 
     } 
    } 
Cuestiones relacionadas