2009-04-15 14 views
93

Estoy usando el método anterior & que funciona bien con un parámetro en la URL.¿Cómo usar getJSON, enviando datos con el método de publicación?

p. Ej. Students/getstud/1 donde se aplica el formato de controlador/acción/parámetro.

Ahora tengo una acción en el controlador de Estudiantes que acepta dos parámetros y devuelve un objeto JSON.

Entonces, ¿cómo puedo publicar datos con $.getJSON() utilizando el método de publicación?

También se aceptan métodos similares.

El punto es llamar una acción del controlador con AJAX.

+4

'' GET' en getJSON' significa * * utilizar GET para obtener algunos JSON. –

+0

@Majid Fouladpour Cuando hice esta pregunta, ¡no lo sabía ...! – Vikas

Respuesta

190

El método $ .getJSON() realiza un HTTP GET y no POST. Es necesario utilizar $.post()

$.post(url, dataToBeSent, function(data, textStatus) { 
    //data contains the JSON object 
    //textStatus contains the status: success, error, etc 
}, "json"); 

En esa llamada, dataToBeSent podría ser cualquier cosa que desee, aunque si se envía el contenido de un formulario de una página HTML, puede utilizar el método serialize para crear los datos para el puesto de su formar.

var dataToBeSent = $("form").serialize(); 
+5

Solo quiero agregar que $ .getJSON admite Jsonp (acceso de dominio cruzado) desafortunadamente $ .post no. – Tomas

+1

En realidad, .getJSON() admite el acceso de dominio cruzado de dos maneras. JSONP, que no usa GET o POST, sino inyección de scripts; pero también CORS - y .post() también es compatible con CORS. Sin embargo, CORS requiere que el servidor también lo soporte, mientras que JSONP no lo admite. – hippietrail

+2

No es cierto, JSONP también requiere soporte del servidor para analizar el parámetro de devolución de llamada. – Shrulik

-8

si usted tiene sólo dos parámetros se puede hacer esto:

$.getJSON('/url-you-are-posting-to',data,function(result){ 

    //do something useful with returned result// 
    result.variable-in-result; 
}); 
+4

Creo que esta no es la respuesta a lo que se ha pedido. –

12

Ésta es mi solución "de una línea":

$.postJSON = function(url, data, func) { $.post(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); } 

Para utilizar jsonp, y POST método, esta función agrega el parámetro GET de "devolución de llamada" a la URL. Esta es la manera de usarlo:

$.postJSON("http://example.com/json.php",{ id : 287 }, function (data) { 
    console.log(data.name); 
}); 

El servidor debe estar preparado para manejar el parámetro de devolución de llamada GET y devuelve la cadena JSON como:

jsonp000000 ({"name":"John", "age": 25}); 

en el que "jsonp000000" es el valor GET devolución de llamada .

En PHP la puesta en práctica sería como:

print_r($_GET['callback']."(".json_encode($myarr).");"); 

Hice algunas pruebas entre dominios y parece que funciona. Aún así, necesito más pruebas.

+1

Esto nunca pasará por alto el límite GET tiene, mientras que el tamaño máximo de POST se puede redefinir. – Dementic

+0

¿Por qué agregaste '? Callback'? en url? Eso hizo que la devolución de llamada no fuera llamada por mí. También agregué 'JSON.stringify (data)'. +1, publicación útil –

+0

@ IonicăBizău: gracias. Para devolver un objeto, necesitamos agregar el parámetro "devolución de llamada" a la URL y el servidor debe devolver el mismo nombre de objeto generado por JQuery. También utilizo una función de anulación para getJSON(): 'jQuery.getJSON = function (url, data, func) {return $ .get (url + (url.indexOf ("? ") == -1?"? ":" & ") +" callback =? ", data, func," json "); } ' – lepe

3

Tenía el código que estaba haciendo getJSON. Simplemente lo reemplacé por una publicación. Para mi sorpresa, funcionó

$.post("@Url.Action("Command")", { id: id, xml: xml }) 
     .done(function (response) { 
      // stuff 
     }) 
     .fail(function (jqxhr, textStatus, error) { 
      // stuff 
     }); 



    [HttpPost] 
    public JsonResult Command(int id, string xml) 
    { 
      // stuff 
    } 
1

$.getJSON() es bastante útil para el envío de una petición AJAX y volver datos JSON como respuesta. Lamentablemente, la documentación de jQuery carece de una función hermana que debe llamarse $.postJSON(). ¿Por qué no usar $.getJSON() y terminar con esto? Bueno, quizás quiera enviar una gran cantidad de datos o, en mi caso, IE7 simplemente no quiere trabajar correctamente con una solicitud GET.

Es cierto, actualmente no hay $.postJSON() método, pero se puede obtener el mismo resultado especificando un cuarto parámetro (tipo) en la función $.post():

Mi código se veía así:

$.post('script.php', data, function(response) { 
    // Do something with the request 
}, 'json'); 
3

Sólo añadir estas líneas a su <script> (en alguna parte después de jQuery está cargado pero antes de publicar cualquier cosa):

$.postJSON = function(url, data, func) 
{ 
    $.post(url, data, func, 'json'); 
} 

Reemplace (algo/todo) $.getJSON con $.postJSON y ¡disfrútelo!

Puede utilizar las mismas funciones de devolución de llamada de Javascript que con $.getJSON. No es necesario cambiar el lado del servidor. (Bueno, siempre recomiendo usar $_REQUEST en PHP. http://php.net/manual/en/reserved.variables.request.php, Among $_REQUEST, $_GET and $_POST which one is the fastest?)

Esto es más simple que la solución de @ lepe.

+0

Esto no funcionó con los métodos done() y fail() que normalmente puede aplicar a getJSON. – HackWeight

1

acabo de utilizar correos y un if:

data = getDataObjectByForm(form); 
var jqxhr = $.post(url, data, function(){}, 'json') 
    .done(function (response) { 
     if (response instanceof Object) 
      var json = response; 
     else 
      var json = $.parseJSON(response); 
     // console.log(response); 
     // console.log(json); 
     jsonToDom(json); 
     if (json.reload != undefined && json.reload) 
      location.reload(); 
     $("body").delay(1000).css("cursor", "default"); 
    }) 
    .fail(function (jqxhr, textStatus, error) { 
     var err = textStatus + ", " + error; 
     console.log("Request Failed: " + err); 
     alert("Fehler!"); 
    }); 
Cuestiones relacionadas