Próbuję przekazać tablicę obiektów do metody kontrolera MVC przy użyciu funkcji ajax () jQuery. Kiedy dostaję się do metody kontrolera C # PassThing (), argument „things” ma wartość null. Próbowałem tego przy użyciu typu listy jako argumentu, ale to też nie działa. Co ja robię źle?
<script type="text/javascript">
$(document).ready(function () {
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: 'POST',
url: '/Xhr/ThingController/PassThing',
data: JSON.stringify(things)
});
});
</script>
public class ThingController : Controller
{
public void PassThing(Thing[] things)
{
// do stuff with things here...
}
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
}
c#
asp.net-mvc
jquery
Zimorodek
źródło
źródło
Odpowiedzi:
Korzystając z sugestii NickW, udało mi się to uruchomić, używając
things = JSON.stringify({ 'things': things });
Oto pełny kod.Nauczyłem się z tego dwóch rzeczy:
Ustawienia contentType i dataType są absolutnie niezbędne w funkcji ajax (). Nie zadziała, jeśli ich brakuje. Dowiedziałem się tego po wielu próbach i błędach.
Aby przekazać tablicę obiektów do metody kontrolera MVC, po prostu użyj formatu JSON.stringify ({'things': things}).
Mam nadzieję, że to pomoże komuś innemu!
źródło
http://localhost:52459/Sales/completeSale?itemsInCart=[{"ItemId":1,"Quantity":"1","Price":3.5}]
iSales.completeSale
jestpublic ActionResult completeSale(ItemInCart[] itemsInCart)
, oznaczony jakoHttpGet
.data: JSON.stringify(things),
dataType
to nie jest konieczne. Jeśli zostanie pominięty, funkcja ajax rozwiąże to na podstawie zwróconych danychNie mógłbyś po prostu tego zrobić?
... i oznacz swoje działanie za pomocą
źródło
Formatowanie danych może być problemem. Wypróbuj jedno z poniższych:
Lub (z Jak mogę opublikować tablicę ciągów do kontrolera ASP.NET MVC bez formularza? )
źródło
Używam aplikacji sieci Web .Net Core 2.1 i nie mogę tutaj uzyskać ani jednej odpowiedzi, aby działała. Otrzymałem pusty parametr (jeśli w ogóle wywołano metodę) lub błąd serwera 500. Zacząłem bawić się każdą możliwą kombinacją odpowiedzi i w końcu uzyskałem efekt pracy.
W moim przypadku rozwiązanie wyglądało następująco:
Skrypt - stringify oryginalnej tablicy (bez używania nazwanej właściwości)
W metodzie kontrolera użyj [FromBody]
Niepowodzenia obejmują:
Nazwanie treści
data: {content: nodes}, // Błąd serwera 500
Brak contentType = Błąd serwera 500
Uwagi
dataType
nie jest potrzebny, pomimo tego, co mówią niektóre odpowiedzi, ponieważ jest używany do dekodowania odpowiedzi (więc nie ma znaczenia dla przykładów żądań tutaj).List<Thing>
działa również w metodzie kontroleraźródło
Na to wszystko mam doskonałą odpowiedź: wypróbowałem tak wiele rozwiązań, których w końcu nie mogłem sobie poradzić, poniżej znajdziesz szczegółową odpowiedź:
Kontroler
źródło
Jedynym sposobem, aby to zadziałało, jest przekazanie JSON jako ciągu, a następnie deserializacja za pomocą
JavaScriptSerializer.Deserialize<T>(string input)
, co jest dość dziwne, jeśli jest to domyślny deserializator dla MVC 4.Mój model ma zagnieżdżone listy obiektów, a najlepsze, co mogłem uzyskać przy użyciu danych JSON, to najwyższa lista zawierająca poprawną liczbę elementów, ale wszystkie pola w elementach były puste.
Takie rzeczy nie powinny być takie trudne.
źródło
To działa kod dla twojego zapytania, możesz go użyć.
Kontroler
javascript
źródło
Zawijanie listy obiektów innym obiektem zawierającym właściwość pasującą do nazwy parametru, którego oczekuje kontroler MVC, działa. Ważnym elementem jest opakowanie wokół listy obiektów.
źródło
źródło
Jeśli korzystasz z interfejsu API sieci Web ASP.NET, po prostu prześlij
data: JSON.stringify(things)
.Twój kontroler powinien wyglądać mniej więcej tak:
źródło
Modyfikacja z @veeresh i
źródło
Co zrobiłem, próbując wysłać dane z kilku wybranych wierszy w DataTable do akcji MVC:
HTML Na początku strony:
(wyświetlany jest tylko wiersz, powiąż z modelu):
Przycisk uruchamiający funkcję JavaScript:
Funkcja JavaScript:
Akcja MVC:
I MODEL w C #:
WNIOSEK:
Przyczyna BŁĘDU:
Atrybut Is:
[ValidateAntiForgeryToken]
dla akcji MVCStartWorkflow
Rozwiązanie w połączeniu Ajax:
Aby wysłać Listę obiektów należy uformować dane jak w przykładzie (obiekt listy wypełniającej) oraz:
data: {model: list},
type: "post",
źródło
Jak dla mnie to działa dobrze:
Z „ContentType” wielką literą „C”.
źródło