Próbuję przekazać tablicę (lub IEnumerable) ints z przez AJAX do akcji MVC i potrzebuję trochę pomocy.
javascript to
$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...
a akcją kontrolera jest
public ActionResult MyAction(IEnumerable<int> arrayOfValues )
W tej chwili żądanie jest sformatowane jako
controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437
Jestem prawie na miejscu, jeśli usunę nawiasy kwadratowe, otrzymam poprawną odpowiedź. Jak powinienem przekazać tę tablicę do mojego get, aby kontroler mógł rozpoznać, co to jest?
Wielkie dzięki za Twoją pomoc
Dave
c#
asp.net-mvc
jquery
Dave
źródło
źródło
W przeszłości miałem problemy podczas próby wykonania POST (nie jestem pewien, czy to jest dokładnie to, co robisz, ale przypominam sobie, że podczas przekazywania tablicy tradycyjna musi być ustawiona na true .
źródło
Dość późno, ale inaczej odpowiedź od tych już obecnych tutaj:
Jeśli zamiast tego
$.ajax
chciałbyś użyć funkcji skróconych$.get
lub$.post
, możesz przekazać tablice w ten sposób:Skrótowe POBIERZ
Stenografia POST
Uwagi:
$.param
jest dlatraditional
właściwości, która MUSI być,true
aby to zadziałało .źródło
Powinieneś być w stanie to zrobić dobrze:
Wtedy Twoja metoda działania wyglądałaby tak:
Wygląda na to, że musisz po prostu zdefiniować wartości. JSONValueProvider w MVC przekonwertuje to z powrotem na IEnumerable dla Ciebie.
źródło
Odpowiedź na użycie opcji „tradycyjnej” jest prawidłowa. Podaję tylko dodatkowe informacje dla tych, którzy chcą dowiedzieć się więcej.
Z dokumentacji jQuery:
Możesz również przeczytać więcej tutaj: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers i http://haacked.com/archive /2008/10/23/model-binding-to-a-list.aspx
HTH
źródło
JEŚLI WSZYSTKO INNE ZAWIEDZIE...
Żadna z pozostałych odpowiedzi nie rozwiązała mojego problemu. Próbowałem wykonać wywołanie metody GET z JavaScript do kontrolera interfejsu API sieci Web MVC i wysłać tablicę liczb całkowitych jako parametr w ramach tego żądania. Wypróbowałem tutaj wszystkie rozwiązania, ale nadal parametr na moim kontrolerze zbliżał się do NULL (lub Nic dla użytkowników VB).
W końcu znalazłem swoje rozwiązanie w innym poście SO i było to naprawdę proste: po prostu dodaj
[FromUri]
adnotację przed parametrem tablicy w kontrolerze ( musiałem również wykonać wywołanie przy użyciu „tradycyjnego” ustawienia AJAX, aby uniknąć adnotacji w nawiasach ). Zobacz poniżej rzeczywisty kod, którego użyłem w mojej aplikacji.Podpis kontrolera:
UWAGA: Adnotacja w C # byłaby
[FromUri]
JavaScript:
Rzeczywisty ciąg adresu URL:
źródło
Trochę późno tutaj, ale mógłbym użyć rozwiązania SNag dalej w $ .ajax (). Oto kod, gdyby komuś pomógł:
źródło
Jeśli przeprowadzasz migrację do ASP.NET Core MVC z .Net Framework MVC, tak jak ja, sytuacja nieco się zmieniła. Wywołanie AJAX musi znajdować się w surowym obiekcie przy użyciu stringify, więc zamiast przekazywania danych
{ vals: arrayOfValues }
powinno wyglądaćJSON.stringify(arrayOfValues)
następująco:Inną zmianą, która została wprowadzona w ASP.NET Core, jest zapobieganie fałszowaniu żądań między lokacjami, więc dla wywołań akcji MVC z metody ajax
[FromBody]
należy zastosować atrybut do parametru akcji w następujący sposób:źródło
Jeśli używasz ASP.NET Core MVC i potrzebujesz obsługi nawiasów kwadratowych (zamiast używać opcji „tradycyjnej” jQuery), jedyną opcją, jaką znalazłem, jest ręczne skompilowanie
IEnumerable
metody contoller.źródło
Pracuję z asp.net core 2.2 i jquery i muszę przesłać złożony obiekt („główna klasa”) z widoku do kontrolera z prostymi polami danych i niektórymi tablicami.
Jak tylko dodałem tablicę w definicji `` klasy głównej '' c # (patrz poniżej) i przesłałem (poprawną wypełnioną) tablicę przez ajax (post), cały obiekt był pusty w kontrolerze.
Po pierwsze, pomyślałem, że przyczyną był brak „tradycyjnego: prawda” w moim wywołaniu Ajax, ale tak nie jest.
W moim przypadku powodem była definicja w c # „main class”.
W `` klasie głównej '' miałem:
a EreignisTagNeu został zdefiniowany jako:
Musiałem zmienić definicję w `` klasie głównej '' na:
Teraz działa.
Więc ... dla mnie wydaje się, że rdzeń asp.net ma problem (z postem), jeśli lista dla tablicy nie jest całkowicie zdefiniowana w `` klasie głównej ''.
Uwaga: w moim przypadku działa to z lub bez „tradycyjnego: prawda” w wywołaniu Ajax
źródło
Musisz przekonwertować tablicę na ciąg:
działa to nawet w postaci int, long lub string
źródło