Tworzę małą aplikację do nauki ASP.NET MVC i JQuery, a jedna ze stron to lista elementów, w których można wybrać niektóre. Następnie chciałbym nacisnąć przycisk i wysłać do mojego kontrolera Listę (lub coś równoważnego) zawierającą identyfikatory wybranych elementów, używając funkcji Post JQuery.
Udało mi się uzyskać tablicę z identyfikatorami wybranych elementów, a teraz chcę to opublikować. Jednym ze sposobów, w jaki mogę to zrobić, jest umieszczenie na mojej stronie fałszywego formularza z ukrytą wartością, a następnie ustawienie ukrytej wartości dla wybranych elementów i opublikowanie tego formularza; jednak wygląda to nieładnie.
Czy istnieje prostszy sposób na osiągnięcie tego celu, wysyłając tablicę bezpośrednio do kontrolera? Próbowałem kilku różnych rzeczy, ale wygląda na to, że kontroler nie może zmapować odbieranych danych. Oto kod do tej pory:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
A potem mój kontroler wygląda tak
public ActionResult GenerateList(List<string> values)
{
//do something
}
Wszystko, co udało mi się uzyskać, to „null” w parametrze kontrolera ...
Jakieś wskazówki?
źródło
Request["values[]"]
Odpowiedzi:
Zmodyfikowałem swoją odpowiedź, aby uwzględnić kod aplikacji testowej, którą zrobiłem.
Aktualizacja: Zaktualizowałem jQuery, aby ustawić „tradycyjne” ustawienie na true, więc to zadziała ponownie (zgodnie z odpowiedzią @DustinDavis).
Najpierw javascript:
A oto kod w mojej klasie kontrolera:
Kiedy wywołuję tę funkcję javascript, pojawia się komunikat „Pierwszy element na liście:„ item1 ””. Mam nadzieję że to pomoże!
źródło
dataType: 'JSON'
powoduje to, że jQuery próbuje parsować odpowiedź jako JSON i popełni błąd, jeśli nie jest to prawidłowy JSON.dataType: 'json'
jest dla typu zwracanego i nie jest wymagane, aby wysłać tablicę do działania.contentType: "application/json; charset=utf-8"
, jest tym, ale w niektórych przypadkach takich jak to nie jest wymagane.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
FYI: JQuery zmienił sposób serializacji danych postu.
http://forum.jquery.com/topic/nested-param-serialization
Musisz ustawić „Tradycyjne” ustawienie na „prawda”, w innym przypadku
wyjdzie jako
zamiast
źródło
$.ajax({ ..., traditional: true});
pomoże przywrócić tradycyjną serializację.ints
. Kiedy używamtraditional: true
, działa, twoja odpowiedź i link wyjaśnia dlaczego . Działa również, gdy używamtype: "POST"
, bez użyciatraditional: true
. Dlaczego? Czy możesz prosić o rozwinięcie. Do Twojej wiadomości używam Asp.Net Mvc.Dziękuję wszystkim za odpowiedzi. Innym szybkim rozwiązaniem będzie użycie metody jQuery.param z tradycyjnym parametrem ustawionym na true, aby przekonwertować obiekt JSON na ciąg znaków:
źródło
Nie publikuj danych jako tablicy. Aby powiązać z listą, pary klucz / wartość należy przesłać z taką samą wartością dla każdego klucza.
Nie potrzebujesz do tego formularza. Potrzebujesz tylko listy par klucz / wartość, którą możesz dołączyć do połączenia z $ .post.
źródło
w
.NET4.5
,MVC 5
JavaScript:
obiekt w JS:
mechanizm, który publikuje.
DO#
Obiekty:
Kontroler:
Obiekt otrzymany:
Mam nadzieję, że to pozwoli Ci zaoszczędzić trochę czasu.
źródło
Kolejna implementacja, która działa również z listą obiektów, a nie tylko ciągami znaków:
JS:
Zakładając, że „selectedValues” to Array of Objects.
W kontrolerze parametrem jest lista odpowiednich modeli ViewModels.
źródło
Jak omówiono tutaj ,
jeśli chcesz przekazać niestandardowy obiekt JSON do akcji MVC, możesz użyć tego rozwiązania, działa jak urok.
Prawdziwą zaletą tego rozwiązania jest to, że nie trzeba definiować nowej klasy dla każdej kombinacji argumentów, a ponadto można łatwo rzutować obiekty na ich oryginalne typy.
Możesz użyć takiej metody pomocniczej, aby ułatwić sobie pracę:
źródło
Możesz ustawić parametr globalny za pomocą
źródło
Odpowiedź bardzo mi pomogła w tej sytuacji, więc dziękuję za to. Jednak w celu odniesienia w przyszłości ludzie powinni powiązać model, a następnie sprawdzić poprawność. Ten post od Phila Haacka opisuje to dla MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
Mam nadzieję, że to komuś pomoże.
źródło