Saya membuat aplikasi kecil untuk belajar sendiri ASP.NET MVC dan JQuery, dan salah satu halaman adalah daftar item di mana beberapa dapat dipilih. Kemudian saya ingin menekan tombol dan mengirim Daftar (atau sesuatu yang setara) ke controller saya yang berisi id item yang dipilih, menggunakan fungsi JQuery's Post.
Saya berhasil mendapatkan array dengan id dari elemen yang dipilih, dan sekarang saya ingin mempostingnya. Salah satu cara saya bisa melakukan ini adalah memiliki formulir dummy di halaman saya, dengan nilai tersembunyi, dan kemudian mengatur nilai tersembunyi dengan item yang dipilih, dan memposting formulir itu; ini terlihat crufty.
Apakah ada cara yang lebih bersih untuk mencapai ini, dengan mengirim array langsung ke controller? Saya sudah mencoba beberapa hal berbeda tetapi sepertinya pengontrol tidak dapat memetakan data yang diterimanya. Berikut kodenya sejauh ini:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
Dan Controller saya terlihat seperti ini
public ActionResult GenerateList(List<string> values)
{
//do something
}
Yang berhasil saya dapatkan adalah "null" di parameter controller ...
Ada tips?
sumber
Request["values[]"]
Jawaban:
Saya mengubah respons saya untuk memasukkan kode untuk aplikasi pengujian yang saya lakukan.
Pembaruan: Saya telah memperbarui jQuery untuk mengatur pengaturan 'tradisional' menjadi true sehingga ini akan berfungsi lagi (per jawaban @DustinDavis ').
Pertama javascript:
Dan ini kode di kelas controller saya:
Ketika saya memanggil fungsi javascript itu, saya mendapatkan peringatan yang mengatakan "Item pertama dalam daftar: 'item1'". Semoga ini membantu!
sumber
dataType: 'JSON'
menyebabkan jQuery mencoba mem-parsing respons sebagai JSON, dan akan kesalahan jika itu bukan JSON yang valid.dataType: 'json'
adalah untuk tipe kembali dan tidak perlu mengirim array ke Action.contentType: "application/json; charset=utf-8"
, adalah satu-satunya, tetapi dalam beberapa kasus seperti ini tidak diperlukan.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
FYI: JQuery mengubah cara mereka membuat serial data pos.
http://forum.jquery.com/topic/nested-param-serialization
Anda harus mengatur pengaturan 'Tradisional' menjadi true, selain bijaksana
akan keluar sebagai
dari pada
sumber
$.ajax({ ..., traditional: true});
akan membantu untuk kembali ke serialisasi tradisional.ints
. Ketika saya gunakantraditional: true
, itu berfungsi, jawaban dan tautan Anda menjelaskan alasannya . Ini juga berfungsi ketika saya menggunakantype: "POST"
, tanpa menggunakantraditional: true
. Mengapa demikian? Bisakah Anda jelaskan. FYI Saya menggunakan Asp.Net Mvc.Terima kasih semuanya atas jawabannya. Solusi cepat lainnya adalah menggunakan metode jQuery.param dengan parameter tradisional disetel ke true untuk mengonversi objek JSON menjadi string:
sumber
Jangan memposting data sebagai array. Untuk mengikat ke daftar, pasangan kunci / nilai harus diserahkan dengan nilai yang sama untuk setiap kunci.
Anda seharusnya tidak memerlukan formulir untuk melakukan ini. Anda hanya perlu daftar pasangan kunci / nilai, yang dapat Anda sertakan dalam panggilan ke $ .post.
sumber
Di
.NET4.5
,MVC 5
Javascript:
objek di JS:
mekanisme yang melakukan posting.
C #
Benda:
Pengendali:
Objek yang diterima:
Semoga ini menghemat waktu Anda.
sumber
Implementasi lain yang juga bekerja dengan daftar objek, bukan hanya string:
JS:
Dengan asumsi bahwa 'selectedValues' adalah Array of Objects.
Dalam controller parameternya adalah daftar ViewModels yang sesuai.
sumber
Seperti yang saya diskusikan di sini ,
Jika Anda ingin meneruskan objek JSON kustom ke aksi MVC maka Anda dapat menggunakan solusi ini, itu berfungsi seperti pesona.
Manfaat nyata dari solusi ini adalah Anda tidak perlu mendefinisikan kelas baru untuk setiap kombinasi argumen dan di samping itu, Anda dapat melemparkan objek Anda ke tipe aslinya dengan mudah.
Anda dapat menggunakan metode pembantu seperti ini untuk memfasilitasi pekerjaan Anda:
sumber
Anda dapat mengatur parameter global dengan
sumber
Jawabannya banyak membantu saya dalam situasi saya jadi terima kasih untuk itu. Namun untuk referensi di masa mendatang orang harus mengikat ke model dan kemudian memvalidasi. Posting ini dari Phil Haack menjelaskan ini untuk MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
Semoga ini bisa membantu seseorang.
sumber