2011-08-19 15 views
7

Próbuję i walczę, aby wysłać tablicę przez JSON do akcji kontrolera MVC.Wyślij tablicę do kontrolera MVC przez JSON?

Oto, co mam i co próbowałem ...

//Get checked records 
var $checkedRecords = $(':checked'); //e.g. 3 rows selected = [input 4, input 5, input 6] 

//Have tried following: 
sendingVar: $checkedRecords.serializeArray(); // gives array of 0's 
sendingVar: JSON.stringify($checkedRecords); // gives "{\"length\":1,\"prevObject\":{\"0\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"context\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"length\":1},\"context\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"selector\":\":checked\",\"0\":{}}"...wtf 

//Post 
$.post(url, { sendingVar: sendingVar }, function(data) {alert(data); }); 

jaki sposób mogę to zrobić?

edytuj: do tych, które sugerują wysłanie $checkedRecords "tak jak jest" z górnej linii - to nie działa. Mam dziwny wyjątek gdzieś w jQuery framework :(

uncaught exception: [Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://.../.../.../jquery-1.4.4.min.js :: <TOP_LEVEL> :: line 141" data: no] 

której myślę to znaczy próbuje przypisać wartość null do czegoś nie można

Edycja. Używam MVC2 nie 3

Edit2: Po @ Poniedziałkowa answer- problemem jest to, ze względu na to, jak mam zbudowany tablicę jak[input 4, input 5, input 6] i nie [4,5,6] - jakieś pomysły jak mogę po prostu wartości w tablicy zamiast

Edycja3: przestań głosować w górę, gdy duplikat się nie powiedzie. Czy rzeczywiście przeczytałeś mój problem lub przeczytałeś powiązane problemy? to jest inny problem

@Daveo:

I don't want to build in an overriding custom attribute just to send an array from JSON, that is rediculous jak już omówione w tej kwestii, to nie jest konieczne.

MVC3 - irrelevant

+1

możliwe duplikat: http://stackoverflow.com/questions/320291/how-to-post-an-array- z-complex-objects-with-json-jquery-to-asp-net-mvc-controll i http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to- asp-net-mvc3 – Daveo

+0

Jaki jest twój pożądany wynik? Twoja tablica jest z obiektów jQuery, wersja stringify wygląda mi na prawo. Jak masz wyglądać? – BZink

+0

to tylko tablica zawierająca identyfikatory ciągów sprawdzanych elementów. Chcę, aby checkRecords zawierał tablicę wszystkich identyfikatorów wybranych elementów. Wybrane wejście "wartość" zawiera potrzebną wartość identyfikatora. – baron

Odpowiedz

22

Oto moje demo, użyj mvc2, nadzieję, że niektóre pomaga ~

Kluczem do sukcesu jest traditional

ustawić parametr traditional do prawdziwej

$(function(){ 
    var a = [1, 2]; 
    $.ajax({ 
     type: "POST", 
     url: "<%= ResolveUrl("~/Home/PostArray/") %>", 
     data: {orderedIds: a}, 
     dataType: "json", 
     traditional: true, 
     success: function(msg){alert(msg)} 
    }); 
}) 

Od jQuery 1.4 ten parametr istnieje, ponieważ zmieniono mechanizm serializacji obiektów na parametry zapytania.

i działanie jest ~

[HttpPost] 
public ActionResult PostArray(int[] orderedIds) 
{ 
    return Content(orderedIds.Length.ToString()); 
} 
+0

Niestety, to nie działa. 'zamówionedy' jest puste w metodzie sterownika. Podejrzewam, ponieważ ajax faktycznie robi 'GET'? – baron

+1

@baron - W mojej lokalizacji działa poprawnie. 'zamówionedy' to nazwa parametru – Monday

+1

Przepraszam Hmmm, masz rację, ten kod działa. Problem polega na tym, że otrzymuję tablicę sprawdzonych identyfikatorów za pomocą 'var $ checkedRecords = $ (': checked');' co daje mi '[input 3, input 4, input 5]' where faktycznie potrzebuję: ' [1, 2] '. Dziękuję – baron

0

można również użyć JSON.stringyfy aby wysłał dane jako ciąg następnie użyć JavaScriptSerializer class przy sprowadzaniu dane.

W kodu C#, aby uzyskać dane, będzie wyglądać następująco:

JavaScriptSerializer js = new JavaScriptSerializer(); 

js.Deserialize<T>(string paramiter); 
Powiązane problemy