Saya memiliki aksi pengontrol yang secara efektif mengembalikan JsonResult dari model saya. Jadi, dalam metode saya, saya memiliki sesuatu seperti berikut:
return new JsonResult(myModel);
Ini bekerja dengan baik, kecuali untuk satu masalah. Ada properti tanggal dalam model dan ini tampaknya dikembalikan dalam hasil Json seperti:
"\/Date(1239018869048)\/"
Bagaimana saya harus berurusan dengan tanggal sehingga dikembalikan dalam format yang saya butuhkan? Atau bagaimana saya menangani format ini di atas dalam skrip?
javascript
asp.net-mvc
json
Jon Archway
sumber
sumber
Jawaban:
Hanya untuk memperluas jawaban casperOne .
Spesifikasi JSON tidak memperhitungkan nilai tanggal. MS harus membuat panggilan, dan jalur yang mereka pilih adalah untuk mengeksploitasi sedikit trik dalam representasi javascript string: string literal "/" sama dengan "\ /", dan string literal tidak akan pernah di -serialisasi menjadi " \ / "(datar" \ / "harus dipetakan ke" \\ / ").
Lihat http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 untuk penjelasan yang lebih baik (gulir ke bawah ke "Dari JavaScript Literals ke JSON")
Solusi adalah dengan menguraikannya:
Namun saya pernah mendengar bahwa ada pengaturan di suatu tempat untuk mendapatkan serializer ke
DateTime
objek keluaran dengannew Date(xxx)
sintaks. Saya akan mencoba menggali itu.Parameter kedua dari
JSON.parse()
menerimareviver
fungsi di mana menentukan bagaimana nilai awalnya diproduksi oleh, sebelum dikembalikan.Berikut ini contoh untuk kencan:
Lihat dokumen JSON.parse ()
sumber
parseInt()
. Ini memberitahu fungsi untuk mengekstrak integer dalam sistem angka 10 basis. Itu radix. Jika dimasukkan8
ke sana, itu akan mengekstrak angka oktal.Inilah solusi saya di Javascript - sangat mirip dengan JPot, tetapi lebih pendek (dan mungkin sedikit lebih cepat):
"value.substr (6)" mengeluarkan bagian "/ Date (", dan fungsi parseInt mengabaikan karakter non-angka yang terjadi di akhir.
EDIT: Saya sengaja mengabaikan radix (argumen ke-2 untuk parseInt); lihat komentar saya di bawah ini . Perlu diketahui juga bahwa tanggal ISO-8601 lebih disukai daripada format lama ini - jadi format ini umumnya tidak boleh digunakan untuk pengembangan baru. Lihat perpustakaan Json.NET yang sangat baik untuk alternatif hebat yang membuat serialisasi tanggal menggunakan format ISO-8601.
Untuk tanggal JSON yang diformat ISO-8601, cukup masukkan string ke konstruktor Tanggal:
sumber
value.substr(6, 13)
untuk menghapus karakter non-angka lainnya. Tetapi jika Anda melakukan itu, semua tanggal SEBELUM 04/26/1938 tidak valid! Kami tidak tahuparseInt
akan mengabaikan karakter bukan angka. Terima kasih!parseInt
harus mengabaikan nol di awal ECMAScript ed 5 (2011).Ada sedikit jawaban untuk mengatasinya dari sisi klien, tetapi Anda dapat mengubah sisi server output jika diinginkan.
Ada beberapa cara untuk mendekati ini, saya akan mulai dengan dasar-dasarnya. Anda harus mensubkelas kelas JsonResult dan mengganti metode ExecuteResult. Dari sana Anda dapat mengambil beberapa pendekatan berbeda untuk mengubah serialisasi.
Pendekatan 1: Implementasi default menggunakan JsonScriptSerializer . Jika Anda melihat pada dokumentasi, Anda dapat menggunakan metode RegisterConverters untuk menambahkan JavaScriptConverters kustom . Ada beberapa masalah dengan ini: JavaScriptConverter membuat serial ke kamus, yaitu mengambil objek dan membuat serial ke kamus Json. Untuk membuat objek cerita bersambung menjadi string, ia membutuhkan sedikit peretasan, lihat posting . Retasan khusus ini juga akan lolos dari string.
Pendekatan 2 (disarankan): Pendekatan kedua adalah mulai dengan JsonResult yang ditimpa dan pergi dengan serializer Json lain, dalam kasus saya serializer Json.NET . Ini tidak memerlukan peretasan pendekatan 1. Inilah implementasi saya dari subkelas JsonResult:
Contoh Penggunaan:
Kredit tambahan: James Newton-King
sumber
Moment.js adalah pustaka datetime luas yang juga mendukung ini. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
mis: saat ("/ Tanggal (1198908717056-0700) /")
Mungkin membantu. keluaran plunker
sumber
moment("json_date_string_value").format('appropriate format');
Anda dapat melihat nilai format yang berbeda pada halaman momet.jsSaya menemukan bahwa membuat yang baru
JsonResult
dan kembali yang tidak memuaskan - harus mengganti semua panggilanreturn Json(obj)
denganreturn new MyJsonResult { Data = obj }
adalah menyakitkan.Jadi saya pikir, mengapa tidak membajak saja
JsonResult
menggunakanActionFilter
:Ini dapat diterapkan pada metode apa pun yang mengembalikan a
JsonResult
untuk menggunakan JSON.Net sebagai gantinya:yang akan merespons
seperti yang diinginkan!
Anda dapat, jika Anda tidak keberatan menyebut
is
perbandingan di setiap permintaan, tambahkan ini keFilterConfig
:dan semua JSON Anda sekarang akan diserialisasi dengan JSON.Net alih-alih built-in
JavaScriptSerializer
.sumber
Menggunakan jQuery untuk mengonversi tanggal secara otomatis dengan
$.parseJSON
Karena Anda menggunakan Asp.net MVC, saya curiga Anda menggunakan jQuery di sisi klien. Saya sarankan Anda membaca posting blog ini yang memiliki kode cara menggunakan
$.parseJSON
untuk secara otomatis mengkonversi tanggal untuk Anda.Kode mendukung tanggal yang diformat Asp.net seperti yang Anda sebutkan serta tanggal yang diformat ISO. Semua tanggal akan secara otomatis diformat untuk Anda dengan menggunakan
$.parseJSON()
.sumber
Komunikasi ajax antara klien dan server sering melibatkan data dalam format JSON. Sementara JSON berfungsi dengan baik untuk string, angka dan Boolean, JSON dapat menimbulkan beberapa kesulitan untuk tanggal karena cara ASP.NET membuat serial mereka. Karena tidak memiliki representasi khusus untuk tanggal, mereka diserialisasi sebagai string biasa. Sebagai solusi mekanisme serialisasi default ASP.NET Web Forms dan MVC membuat serialisasi tanggal dalam bentuk khusus - / Tanggal (kutu) / - di mana kutu adalah jumlah milidetik sejak 1 Januari 1970.
Masalah ini dapat diselesaikan dengan 2 cara:
sisi klien
Ubah string tanggal yang diterima menjadi angka dan buat objek tanggal menggunakan konstruktor dari kelas tanggal dengan centang sebagai parameter.
sisi server
Solusi sebelumnya menggunakan skrip sisi klien untuk mengonversi tanggal menjadi objek Tanggal JavaScript. Anda juga dapat menggunakan kode sisi server yang membuat serial .NET DateTime instance dalam format pilihan Anda. Untuk menyelesaikan tugas ini, Anda perlu membuat ActionResult Anda sendiri dan kemudian membuat serial data seperti yang Anda inginkan.
referensi: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
sumber
Saya memiliki masalah yang sama dan alih-alih mengembalikan nilai tanggal aktual saya hanya menggunakan ToString ("dd MMM yyyy") di atasnya. Kemudian di javascript saya, saya menggunakan Date baru (datevalue), di mana datevalue mungkin "01 Jan 2009".
sumber
ToString("o")
?Lihat utas ini:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
Pada dasarnya, sementara
Date()
formatnya adalah javascript yang valid, itu BUKAN JSON yang valid (ada perbedaan). Jika Anda ingin format lama, Anda mungkin harus membuat fasad dan mengubah nilainya sendiri, atau menemukan cara untuk mendapatkan di serializer untuk jenis Anda diJsonResult
dan menggunakannya menggunakan format kustom untuk tanggal.sumber
Bukan cara yang paling elegan tetapi ini berhasil bagi saya:
sumber
Saya telah mengerjakan solusi untuk masalah ini karena tidak ada jawaban di atas yang benar-benar membantu saya. Saya bekerja dengan kalender minggu jquery dan membutuhkan tanggal saya untuk memiliki informasi zona waktu di server dan secara lokal di halaman. Setelah sedikit menggali, saya menemukan solusi yang dapat membantu orang lain.
Saya menggunakan asp.net 3.5, vs 2008, asp.net MVC 2, dan kalender minggu jquery,
Pertama, saya menggunakan perpustakaan yang ditulis oleh Steven Levithan yang membantu menangani tanggal di sisi klien, perpustakaan tanggal Steven Levithan . Format isoUtcDateTime sangat cocok untuk apa yang saya butuhkan. Dalam panggilan AJAX jquery saya, saya menggunakan fungsi format yang disediakan dengan perpustakaan dengan format isoUtcDateTime dan ketika panggilan ajax hits metode tindakan saya, Jenis datetime diatur ke lokal dan mencerminkan waktu server.
Ketika saya mengirim tanggal ke halaman saya melalui AJAX, saya mengirimnya sebagai string teks dengan memformat tanggal menggunakan "ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'zzzz". Format ini mudah dikonversi menggunakan sisi klien
Ini solusi lengkap saya dikurangi sumber Steve Levithan, yang bisa Anda unduh:
Pengendali:
Javascript:
Saya harap contoh cepat ini membantu orang lain dalam situasi yang sama dengan saya. Pada saat ini tampaknya bekerja dengan sangat baik dengan Serialisasi Microsoft JSON dan menjaga tanggal saya benar di seluruh zona waktu.
sumber
Cara yang lebih baik untuk menangani tanggal di knockout adalah dengan menggunakan perpustakaan saat dan menangani tanggal seperti bos. Anda dapat dengan mudah menangani tanggal seperti / Tanggal (-62135578800000) /. Tidak perlu repot bagaimana serialize date Anda di controller.
gunakan seperti
momentjs mendukung banyak format waktu tanggal dan fungsi utilitas pada tanggal.
sumber
Format tanggal dalam kueri.
Satu-satunya masalah dengan solusi ini adalah bahwa Anda tidak akan mendapatkan hasil apa pun jika nilai tanggal APAPUN adalah nol. Untuk menyiasatinya, Anda bisa memasukkan pernyataan kondisional ke dalam kueri Anda SEBELUM Anda memilih tanggal yang mengabaikan tanggal nol atau Anda bisa mengatur kueri untuk mendapatkan semua hasil dan kemudian mengulang semua informasi itu menggunakan loop foreach dan memberikan nilai. untuk semua tanggal yang nol SEBELUM Anda melakukan SELECT Anda yang baru.
Contoh keduanya:
Opsi kedua membutuhkan kueri lain sepenuhnya sehingga Anda dapat menetapkan nilai ke semua nol. Loop ini dan foreach harus SEBELUM permintaan Anda yang memilih nilai-nilai.
Hanya sebuah ide yang saya temukan lebih mudah daripada semua contoh javascript.
sumber
Anda dapat menggunakan metode ini:
sumber
0
Di cshtml Anda,
Di File JS Anda, mungkin app.js,
Di luar app.controller, tambahkan filter di bawah ini.
Di sini "tanggal saya" adalah fungsi yang Anda panggil untuk menguraikan tanggal. Di sini "app" adalah variabel yang berisi angular.module
sumber
tambahkan plugin jquery ui di halaman Anda.
sumber
Bukan untuk apa-apa, tapi ada cara lain. Pertama, buat kueri LINQ Anda. Lalu, buat kueri hasil yang dihitung dan terapkan jenis pemformatan apa pun yang cocok untuk Anda.
Saya harus mengatakan, langkah ekstra itu menyebalkan, tetapi bekerja dengan baik.
sumber
Apa yang berhasil bagi saya adalah membuat model tampilan yang berisi properti tanggal sebagai string. Menetapkan properti DateTime dari model domain dan memanggil .ToString () pada properti date sambil menetapkan nilai ke viewmodel.
Hasil JSON dari metode tindakan MVC akan mengembalikan tanggal dalam format yang kompatibel dengan tampilan.
Lihat Model
Model Domain
Metode Aksi Pengendali
sumber
Timpa pengontrol Json / JsonResult untuk mengembalikan JSON.Net:
Ini berhasil
sumber
Mengganggu, bukan?
Solusi saya adalah mengubah layanan WCF saya untuk mengembalikan DateTimes dalam format yang lebih mudah dibaca (non-Microsoft). Perhatikan di bawah ini, "
UpdateDateOriginal
", yang merupakan format tanggal WCF default, dan "UpdateDate
" saya , yang diformat ke sesuatu yang lebih mudah dibaca.Inilah cara melakukannya:
Mengubah format tanggal WCF
Semoga ini membantu.
sumber
Saya menemukan ini sebagai cara termudah untuk mengubahnya dari sisi server.
sumber
Saya memiliki sejumlah masalah dengan tanggal JSON dan memutuskan untuk menyingkirkan masalah dengan mengatasi masalah tanggal dalam SQL. Ubah format tanggal menjadi format string
Dengan menggunakan fldDateStr masalah menghilang dan saya masih bisa menggunakan bidang tanggal untuk menyortir atau keperluan lain.
sumber
Ini mengembalikan Format Tanggal Server. Anda perlu mendefinisikan fungsi Anda sendiri.
sumber
Berikut adalah beberapa kode JavaScript yang saya tulis yang menetapkan
<input type="date">
nilai dari tanggal yang diteruskan dari ASP.NET MVC.Anda memanggil fungsi ini seperti ini:
Di mana
commissionStartDate
tanggal JSON disahkan oleh MVC.sumber
Yang termudah:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = Tanggal baru (milisegundos). toLocaleDateString ("en-UE");
sumber