Dalam salah satu tindakan pengontrol saya, saya mengembalikan yang sangat besar JsonResult
untuk mengisi kisi.
Saya mendapatkan InvalidOperationException
pengecualian berikut :
Kesalahan selama serialisasi atau deserialisasi menggunakan JSON JavaScriptSerializer. Panjang string melebihi nilai yang ditetapkan pada properti maxJsonLength.
Sayangnya, menyetel maxJsonLength
properti di web.config
ke nilai yang lebih tinggi tidak menunjukkan efek apa pun.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
Saya tidak ingin mengirimkannya kembali sebagai string seperti yang disebutkan dalam jawaban SO ini .
Dalam penelitian saya, saya menemukan posting blog ini di mana menulis sendiri ActionResult
(misalnya LargeJsonResult : JsonResult
) disarankan untuk melewati perilaku ini.
Apakah ini satu-satunya solusi?
Apakah ini bug di ASP.NET MVC?
Apakah saya melewatkan sesuatu?
Bantuan apa pun akan sangat dihargai.
sumber
Jawaban:
Tampaknya ini telah diperbaiki di MVC4.
Anda bisa melakukan ini, yang berhasil untuk saya:
sumber
Anda juga dapat menggunakan
ContentResult
seperti yang disarankan di sini daripada membuat subclassJsonResult
.sumber
Sayangnya pengaturan web.config diabaikan oleh implementasi JsonResult default . Jadi saya kira Anda perlu menerapkan hasil json khusus untuk mengatasi masalah ini.
sumber
Tidak perlu kelas khusus. Ini semua yang dibutuhkan:
di mana
Result
data yang ingin Anda buat serialnya.sumber
Jika menggunakan Json.NET untuk menghasilkan
json
string, itu tidak perlu menyetelMaxJsonLength
nilai.sumber
Saya memecahkan masalah dengan mengikuti tautan ini
sumber
Saya terkejut tidak ada yang menyarankan menggunakan filter hasil. Ini adalah cara terbersih untuk menghubungkan secara global ke dalam pipa tindakan / hasil:
Kemudian, daftarkan sebuah instance dari kelas itu menggunakan
GlobalFilters.Filters
:sumber
Anda dapat mencoba mendefinisikan dalam ekspresi LINQ Anda hanya bidang yang Anda perlukan.
Contoh. Bayangkan Anda memiliki Model dengan Id, Name, Phone dan Picture (byte array) dan perlu memuat dari json ke dalam daftar pilih.
Kueri LINQ:
Masalahnya di sini adalah " pilih u " yang mendapatkan semua bidang. Jadi, jika Anda memiliki gambaran besar, booomm.
Bagaimana menyelesaikan? sangat, sangat sederhana.
Praktik terbaik adalah memilih hanya bidang yang akan Anda gunakan.
Ingat. Ini adalah tip sederhana, tetapi dapat membantu banyak pengembang ASP.NET MVC.
sumber
Perbaikan ASP.NET MVC 5 alternatif:
Dalam kasus saya, kesalahan terjadi selama permintaan. Pendekatan terbaik dalam skenario saya adalah memodifikasi aktual
JsonValueProviderFactory
yang menerapkan perbaikan pada proyek global dan dapat dilakukan dengan mengeditglobal.cs
file seperti itu.tambahkan entri web.config:
lalu buat dua kelas berikut
Ini pada dasarnya adalah salinan persis dari implementasi default yang ditemukan
System.Web.Mvc
tetapi dengan tambahan nilai appsetting web.config yang dapat dikonfigurasiaspnet:MaxJsonLength
.sumber
Tak satu pun di atas berhasil bagi saya sampai saya mengubah Tindakan sebagai
[HttpPost]
. dan menjadikan tipe ajax sebagaiPOST
.Dan panggilan ajax sebagai
sumber
Apakah perbaikan untuk saya di MVC 4.
sumber
Anda perlu membaca dari bagian konfigurasi secara manual sebelum kode Anda mengembalikan objek JsonResult. Cukup baca dari web.config dalam satu baris:
Pastikan Anda mendefinisikan elemen konfigurasi di web.config
sumber
ini berhasil untuk saya
sumber
ada kasus lain - data dikirim dari klien ke server. ketika Anda menggunakan metode dan model pengontrol sangat besar:
sistem memunculkan pengecualian seperti ini "Kesalahan selama serialisasi atau deserialisasi menggunakan JSON JavaScriptSerializer. Panjang string melebihi nilai yang ditetapkan pada properti maxJsonLength. Nama parameter: input"
Hanya mengubah pengaturan Web.config tidak cukup untuk membantu dalam kasus ini. Anda juga dapat mengganti serializer mvc json untuk mendukung ukuran model data yang besar atau secara manual menghapus model dari Request. Metode pengontrol Anda menjadi:
sumber
Anda dapat meletakkan kode ini di cshtml jika Anda mengembalikan tampilan dari pengontrol dan Anda ingin menambah panjang data tampilan bag saat melakukan encoding di json di cshtml
Sekarang,
dataJsonOnActionGrid1
akan dapat diakses di halaman js dan Anda akan mendapatkan hasil yang tepat.Terima kasih
sumber