2010-09-09 14 views
23

Ich habe folgende wo ich versuche Liste/Array MVC Controller-Methode senden:mit jQuery getJSON

var id = []; 
var inStock = []; 

$table.find('tbody>tr').each(function() { 
    id.push($(this).find('.id').text()); 
    inStock.push($(this).find('.stocked').attr('checked')); 
}); 

var params = {}; 
params.ids = id; 
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', params, function() { 
    alert('finished'); 
});  

in meinem contoller:

public JsonResult UpdateStockList(int[] ids, bool[] stocked) { } 

sowohl Parameter sind null.

Beachten Sie, dass, wenn ich die params auf einzelne Artikel

params.ids = 1; 
params.stocked = true; 

public JsonResult UpdateStockList(int ids, bool stocked) { } 

dann ändern funktioniert es ok, so dass ich glaube nicht, dass es ein Routing-Problem.

Antwort

39

Versuchen Sie, die traditional Flags:

$.ajax({ 
    url: '/home/UpdateStockList', 
    data: { ids: [1, 2, 3], stocked: [true, false] }, 
    traditional: true, 
    success: function(result) { 
     alert(result.status); 
    } 
}); 

funktioniert mit:

public ActionResult UpdateStockList(int[] ids, bool[] stocked) 
{ 
    return Json(new { status = "OK" }, JsonRequestBehavior.AllowGet); 
} 
+0

genial, danke! Es scheint, dass es einen Fehler in getJson mit 1.4.2 gibt, siehe http://forum.jquery.com/topic/getjson-breaks-with-1-4-2-when-parameter-argument-is-anarray – fearofawhackplanet

+2

Dies ist kein Fehler. Es ist eine bahnbrechende Änderung gegenüber der vorherigen Version. Deshalb haben sie den "traditionellen" Parameter eingeführt. –

+0

Ich liebe dich, Mann – heisenberg

6

Leider, während es scheint, dass Jquery eine "traditionelle" Flagge stellt dieses Verhalten auf jQuery.ajax zu wechseln, Es ist nicht auf jQuery.getJSON. Eine Möglichkeit, dies zu umgehen, wäre, das Flag global zu setzen:

jQuery.ajaxSettings.traditional = true;

finden Sie in der Dokumentation für jQuery.param: http://api.jquery.com/jQuery.param/ Auch die Release Notes für diese Änderung sehen: http://jquery14.com/day-01/jquery-14 (Suche nach ‚traditionellen‘)

18

Neben .ajax() Aufruf statt .getJSON() als Darin schlägt vor, oder die Einstellung der globalen jQuery.ajaxSettings.traditional zu true wie jrduncans schon sagt, können Sie auch das Ergebnis von the jQuery .param() function auf Ihrem params Objekt aufrufen, übergeben:

var id = []; 
var inStock = []; 

$table.find('tbody>tr').each(function() { 
    id.push($(this).find('.id').text()); 
    inStock.push($(this).find('.stocked').attr('checked')); 
}); 

var params = {}; 
params.ids = id; 
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', $.param(params, true), function() { 
    alert('finished'); 
});  
+2

Dies sollte die akzeptierte Antwort sein. –

+1

Ja, ich stimme zu. Während Darin auf die traditionelle Flagge hinweist (Du bist toll, versteh mich nicht falsch), diese Antwort nutzt getJson, was OP wollte. –

0

In der Ansicht erzeugen 01.233.(nicht id, wie id sollte pro Feld eindeutig sein), unter Hinweis auf die Verwendung von Name not name:

@foreach (var item in Model.SomeDictionary) 
{ 
    @Html.TextBoxFor(modelItem => item.Value.SomeString, new { Name = "someString[]" }) 
} 

die Eingabefeldwerte mit jQuery dann abrufen, so:

var myArrayValues = $('input[name="someString[]"]').map(function() { return $(this).val(); }).get(); 

Sie diese direkt verwenden können in jQuery/AJAX wie folgt:

$.ajax({ 
    type: "POST", 
    url: "/MyController/MyAction", 
    dataType: 'json', 
    data: { 
     someStrings: $('input[name="someString[]"]').map(function() { return $(this).val(); }).get(), 
     someDates: $('input[name="someDate[]"]').map(function() { return $(this).val(); }).get(), 

dann in der Steuerung in Aktion MVC:

[HttpPost] 
public JsonResult MyAction(string[] someStrings, DateTime[] someDates...