2009-07-02 17 views
55

estoy llamando una acción ASP.NET MVC

public JsonResult GetPatient(string patientID) 
{ 
... 

desde JavaScript y jQuery. La siguiente llamada funciona

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

mientras que esta 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 llegan al 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.

Respuesta

32

Content-Type

No es necesario especificar que 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 acerca de que tipo de contenido aquí: JSON Hijacking and How ASP.NET AJAX 1.0 Avoids these Attacks

datos

Los datos es correcta 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 usa servicios ASP.NET AJAX. 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 para obtener la costumbre de citar cualquier clave o valores de cadena 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 indicar valores numéricos o booleanos. Siempre es seguro usarlos directamente en el objeto.

Así, suponiendo que desea publicar en lugar de GET, su .ajax $() llamada podría tener este aspecto:

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

Gracias. Esto resolvió el problema. Usé $ .compactJSON() para formatear el objeto JS en JSON para la opción de datos. – ChrisP

+0

Como $ .compactJSON ya no está disponible en jQuery, utilicé $ .toJSON desde este complemento aquí: http://code.google.com/p/jquery-json/ –

4

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

+0

Se intentó cambiar el tipo a GET, y los datos cambian en la respuesta de rpcutts, pero el valor sigue siendo nulo en el método de acción. – ChrisP

11

Reemplazar

data: { patientID: "1" }, 

con

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

Más información: 3 mistakes to avoid when using jQuery with ASP.NET

+2

¿No tendría que ser algo así como datos: '{patientID: "1"}', para evitar las comillas dobles anidadas? – Nosredna

+0

No ir. El valor es nulo en el método de acción con este cambio. – ChrisP

+0

intente eliminar la configuración contentType que ha especificado – redsquare

19

.getJson es simplemente una envoltura alrededor de .ajax pero proporciona un método más simple firma ya que algunos de los ajustes se predeterminado eg tipo de datos a json, escriba para obtener etc.

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

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

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

6

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

$ .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, usa algunos criterios limitados como tipo de solicitud es GET y tipo de datos es json .

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

+0

Alguien eliminó el enlace, y esta respuesta no tuvo sentido sin eso, así que lo rodé hacia atrás. – JotaBe

0

con $ .getJSON()) no hay ninguna devolución de llamada de error sólo se puede realizar un seguimiento de éxito de devolución de llamada y no hay ningún establecimiento de normas como el apoyo beforeSend, statusCode, mimeType etc, si lo desea usa $ .ajax().

Cuestiones relacionadas