2009-04-15 2 views
93

Я использую метод выше &, он хорошо работает с одним параметром в URL.Как использовать getJSON, отправляя данные с помощью метода post?

например. Students/getstud/1, где применяется формат контроллера/действия/параметра.

Теперь у меня есть действие в контроллере учащихся, которое принимает два параметра и возвращает объект JSON.

Так как я могу отправить данные с помощью $.getJSON() используя почтовый метод?

Подобные методы также приемлемы.

Дело в том, чтобы вызвать действие контроллера с AJAX.

+4

'' get' в getJSON' означает * использование GET *, чтобы получить некоторые JSON. –

+0

@Majid Fouladpour Когда я задал этот вопрос, я не знал этого ..! – Vikas

ответ

190

Метод $ .getJSON() выполняет HTTP GET, а не POST. Вы должны использовать $.post()

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

В этом призыве, dataToBeSent может быть что угодно, хотя, если отправляет содержимое HTML-форму, вы можете использовать метод serialize для создания данных для POST от вашего форма.

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

Просто хочу добавить, что $ .getJSON поддерживает Jsonp (перекрестный доступ к домену), к сожалению, $ .post нет. – Tomas

+1

На самом деле .getJSON() поддерживает междоменный доступ двумя способами. JSONP, который не использует GET или POST, но использует скрипт; но также CORS - и .post() также поддерживает CORS. Однако CORS требует, чтобы сервер также поддерживал его, тогда как JSONP этого не делает. – hippietrail

+2

Не верно, JSONP также требует поддержки сервера для анализа параметра обратного вызова. – Shrulik

-8

, если у вас есть только два параметра вы можете сделать это:

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

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

Я думаю, что это не ответ на то, что было задано. –

12

Это мой "одна линия" решение:

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

Для того, чтобы использовать JSONP и POST метод, эта функция добавляет параметр «обратного вызова» GET к URL-адресу. Это способ использовать:

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

Сервер должен быть готов обработать параметр обратного вызова GET и возвращает строку JSON, как:

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

, в котором «jsonp000000» это значение GET обратного вызова ,

В PHP реализация будет как:

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

Я сделал несколько тестов междоменных и это похоже на работу. Тем не менее, нужно больше тестировать.

+1

Это никогда не будет обходить предел GET, хотя максимальный размер POST можно переопределить. – Dementic

+0

Почему вы добавили '? Callback'? в url? Это сделало обратный звонок не для меня. Я также добавил 'JSON.stringify (data)'. +1, полезный пост! –

+0

@ IonicăBizău: спасибо. Чтобы вернуть объект, нам нужно добавить параметр «обратного вызова» в URL-адрес, и серверу нужно вернуть то же имя объекта, сгенерированное JQuery. Я также использую функцию переопределения для getJSON(): 'jQuery.getJSON = function (url, data, func) {return $ .get (url + (url.indexOf ("? ") == -1?"? ":" & ") +" callback =? ", data, func," json "); } ' – lepe

3

У меня был код, который делал getJSON. Я просто заменил его почтой. К моему удивлению, он работал

$.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() очень удобно для отправки запроса AJAX и получить обратно данные JSON в качестве ответа. Увы, в документации jQuery нет сестринской функции, которая должна быть названа $.postJSON(). Почему бы просто не использовать $.getJSON() и сделать с ним? Ну, возможно, вы хотите отправить большой объем данных или, в моем случае, IE7 просто не хочет работать должным образом с запросом GET.

Это правда, нет в настоящее время нет $.postJSON() метода, но вы можете сделать то же самое, указав четвертый параметр (типа) в $.post() функции:

Моего кода выглядит следующим образом:

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

Просто добавьте эти строки в <script> (где-то после Jquery загружается, но прежде, чем отправлять что-либо):

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

Замените (некоторые/все) $.getJSON с $.postJSON и наслаждайтесь!

Вы можете использовать одни и те же функции обратного вызова Javascript, как в случае с $.getJSON. Не требуется изменение на стороне сервера. (Ну, я всегда рекомендую использовать $_REQUEST в PHP. http://php.net/manual/en/reserved.variables.request.php, Among $_REQUEST, $_GET and $_POST which one is the fastest?)

Это проще, чем решение @ lepe.

+0

Это не сработало с методами done() и fail(), которые вы обычно можете применить к getJSON. – HackWeight

1

Я просто использовал почту, а также если:

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!"); 
    }); 
Смежные вопросы