Diferencia entre $ .getJSON () y $ .ajax () en jQuery

Estoy llamando a una acción ASP.NET MVC

public JsonResult GetPatient(string patientID) { ... 

desde JavaScript usando jQuery. La siguiente llamada funciona

 $.getJSON( '/Services/GetPatient', { patientID: "1" }, function(jsonData) { alert(jsonData); }); 

mientras que este no.

 $.ajax({ type: 'POST', url: '/Services/GetPatient', data: { patientID: "1" }, contentType: 'application/json; charset=utf-8', dataType: 'json', success: function(jsonData) { alert(jsonData); }, error: function() { alert('Error loading PatientID=' + id); } }); 

Ambos alcanzan el método de acción, pero el valor de patientID es nulo con la llamada $ .ajax. Me gustaría utilizar la llamada $ .ajax para algunas de las devoluciones de llamada avanzadas.

Cualquier pensamiento apreciado.

Tipo de contenido

No necesita especificar ese tipo de contenido en las llamadas a las acciones del controlador MVC. El tipo de contenido especial “application / json; charset = utf-8” solo es necesario cuando se llama a ASP.NET AJAX “ScriptServices” y a los métodos de página. El contenido por defecto de jQuery de “application / x-www-form-urlencoded” es apropiado para solicitar una acción de controlador MVC.

Más sobre ese tipo de contenido aquí: secuestro de JSON y cómo ASP.NET AJAX 1.0 evita estos ataques

Datos

Los datos son correctos como lo tienes. Al pasar jQuery a un objeto JSON, como lo ha hecho, se serializará como patientID = 1 en los datos POST. Esta forma estándar es cómo MVC espera los parámetros.

Solo tiene que adjuntar los parámetros entre comillas como “{‘patientID’: 1}” cuando use servicios AJAX de ASP.NET. Esperan que se analice una única cadena que representa un objeto JSON, en lugar de las variables individuales en los datos POST.

JSON

No es un problema en este caso específico, pero es una buena idea acostumbrarse a citar cualquier clave de cadena o valores en su objeto JSON. Si inadvertidamente utiliza una palabra clave reservada de JavaScript como clave o valor en el objeto, sin citarla, se encontrará con un problema de confuso a depuración.

Por el contrario, no tiene que citar valores numéricos o booleanos. Siempre es seguro usarlos directamente en el objeto.

Por lo tanto, suponiendo que desea realizar POST en lugar de GET, su llamada a $ .ajax () podría verse así:

 $.ajax({ type: 'POST', url: '/Services/GetPatient', data: { 'patientID' : 1 }, dataType: 'json', success: function(jsonData) { alert(jsonData); }, error: function() { alert('Error loading PatientID=' + id); } }); 

.getJson es simplemente un envoltorio alrededor de .ajax pero proporciona una firma de método más simple ya que algunos de los ajustes están predeterminados, por ejemplo, dataType a json, tipo para obtener etc.

NB .load, .get y .post también son envoltorios simples alrededor del método .ajax.

Reemplazar

 data: { patientID: "1" }, 

con

 data: "{ 'patientID': '1' }", 

Lectura adicional: 3 errores para evitar al usar jQuery con ASP.NET

Hay mucha confusión en algunas de las funciones de jquery como $ .ajax, $ .get, $ .post, $ .getScript, $ .getJSON que cuál es la diferencia entre ellas, cuál es la mejor, cuál es la rápida, cuál para usar y cuando más abajo está la descripción de ellos para dejarlos en claro y para deshacerse de este tipo de confusiones.

La función $ .gettJSON () es una función abreviada de Ajax (internamente use $ .get () con script de tipo de datos), que es equivalente a la expresión siguiente. Utiliza algunos criterios limitados, como Tipo de solicitud es OBTENER y Tipo de datos es json.

Leer más .. jquery-post-vs-get-vs-ajax

La única diferencia que veo es que getJSON realiza una solicitud GET en lugar de una POST.

 contentType: 'application/json; charset=utf-8' 

No es bueno. Al menos no funciona para mí. La otra syntax está bien. El parámetro que proporciona está en el formato correcto.

con $ .getJSON ()) no hay ninguna callback de error, solo se puede rastrear la callback exitosa y no hay una configuración estándar compatible como beforeSend, statusCode, mimeType, etc., si se quiere usar $ .ajax ().