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.
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);
}
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');
});
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')
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...