Apakah mungkin menggunakan JSON.NET sebagai serializer JSON default di ASP.NET MVC 3?
Menurut penelitian saya, tampaknya satu-satunya cara untuk mencapai ini adalah dengan memperluas ActionResult karena JsonResult di MVC3 bukanlah virtual ...
Saya berharap bahwa dengan ASP.NET MVC 3 akan ada cara untuk menentukan penyedia pluggable untuk serialisasi ke JSON.
Pikiran?
asp.net-mvc-3
json.net
jsonresult
zam6ak
sumber
sumber
Jawaban:
Saya yakin cara terbaik untuk melakukannya adalah - seperti yang dijelaskan di tautan Anda - dengan memperluas ActionResult atau memperluas JsonResult secara langsung.
Sedangkan untuk metode JsonResult yang tidak virtual pada kontroler itu tidak benar, pilih saja yang kelebihan beban. Ini bekerja dengan baik:
EDIT 1 : Ekstensi JsonResult ...
EDIT 2 : Saya menghapus centang untuk Data menjadi nol sesuai saran di bawah ini. Itu seharusnya membuat versi JQuery yang lebih baru senang dan tampak seperti hal yang waras untuk dilakukan, karena responsnya kemudian dapat dideserialisasi tanpa syarat. Sadarilah, bahwa ini bukan perilaku default untuk tanggapan JSON dari ASP.NET MVC, yang merespons dengan string kosong, saat tidak ada data.
sumber
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Saya pikir perlu menambahkan jawaban cek ini (tanpa internalMvcResources.JsonRequest_GetNotAllowed
tetapi dengan beberapa pesan khusus) Juga, bagaimana dengan 2 pemeriksaan mvc asp.net default lainnya - MaxJsonLength dan RecursionLimit? Apakah kami membutuhkannya jika menggunakan json.net?Saya menerapkan ini tanpa perlu pengontrol atau injeksi dasar.
Saya menggunakan filter tindakan untuk mengganti JsonResult dengan JsonNetResult.
Di Global.asax.cs Application_Start () Anda perlu menambahkan:
Demi penyelesaian, berikut adalah kelas ekstensi JsonNetResult saya yang saya ambil dari tempat lain dan yang saya modifikasi sedikit untuk mendapatkan dukungan penguapan yang benar:
sumber
return Json()
berlaku menggunakan Json.Net.JsonResult
dariJson()
dan mengubahnya menjadiJsonNetResult
. Itu dilakukan dengan menggunakanas
kata kunci yang mengembalikan null jika konversi tidak memungkinkan. Sangat bagus. 10 poin untuk Gryffindor![BetterJsonHandler]
:-).Gunakan konverter JSON Newtonsoft:
sumber
Saya tahu ini baik-baik saja setelah pertanyaan dijawab, tetapi saya menggunakan pendekatan yang berbeda karena saya menggunakan injeksi ketergantungan untuk membuat contoh pengontrol saya.
Saya telah mengganti IActionInvoker (dengan memasukkan Properti ControllerActionInvoker pengontrol) dengan versi yang menggantikan metode InvokeActionMethod.
Ini berarti tidak ada perubahan pada pewarisan pengontrol dan itu dapat dengan mudah dihapus ketika saya meningkatkan ke MVC4 dengan mengubah pendaftaran penampung DI untuk SEMUA pengontrol
--- EDIT - Diperbarui untuk menampilkan pendaftaran kontainer untuk pengontrol. Saya menggunakan Unity di sini.
sumber
Memperluas jawaban dari https://stackoverflow.com/users/183056/sami-beyoglu , jika Anda mengatur tipe Konten, maka jQuery akan dapat mengubah data yang dikembalikan menjadi objek untuk Anda.
sumber
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Posting Saya dapat membantu seseorang.
sumber
BaseController
, ini adalah perubahan dampak terendah - hanya perlu menambahkan kelas dan memperbaruiBaseController
.Saya membuat versi yang membuat tindakan layanan web aman dan sederhana. Anda menggunakannya seperti ini:
Kelas:
sumber