webentwicklung-frage-antwort-db.com.de

Liste/Array als Parameter mit jQuery getJson senden

Ich versuche, die Liste/das Array an die MVC-Controller-Methode zu senden:

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 Controller:

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

beide Parameter sind null.

Beachten Sie das, wenn ich die Parameter in einzelne Elemente umwandle

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

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

dann funktioniert es in Ordnung, also glaube ich nicht, dass es sich um ein Routing-Problem handelt.

23

Setzen Sie das Flag traditional:

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

funktioniert gut mit:

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

Neben dem Aufruf von .ajax() anstelle von .getJSON(), wie Darin vorschlägt, oder setzen Sie den globalen jQuery.ajaxSettings.traditional auf true, wie von jrduncans vorgeschlagen, können Sie auch das Ergebnis des Aufrufs der jQuery .param()-Funktion in Ihrem params-Objekt ü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');
});    
20
hippietrail

Obwohl es scheint, dass Jquery ein "traditionelles" Flag zum Umschalten dieses Verhaltens in jQuery.ajax enthält, ist dies in jQuery.getJSON nicht der Fall. Eine Möglichkeit, dies zu umgehen, wäre, das Flag global zu setzen:

jQuery.ajaxSettings.traditional = true;

Weitere Informationen finden Sie in der Dokumentation zu jQuery.param: http://api.jquery.com/jQuery.param/ . Siehe auch die Versionshinweise für diese Änderung: http://jquery14.com/ Tag 01/Jquery-14 (Suche nach 'traditionell')

6
jrduncans

Erzeugen Sie in der Ansicht mehrere benannte Felder (nicht id, da id für jedes Feld eindeutig sein sollte), und beachten Sie die Verwendung von Name NICHT name :

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

Rufen Sie dann die Eingabefeldwerte mit jQuery ab, so :

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

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

$.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 Controller-Aktion in MVC:

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