Asp.net-MVC sekarang memungkinkan untuk mengikat objek DateTime secara implisit. Saya memiliki tindakan di sepanjang baris
public ActionResult DoSomething(DateTime startDate)
{
...
}
Ini berhasil mengubah string dari panggilan ajax menjadi DateTime. Namun, kami menggunakan format tanggal dd / MM / yyyy; MVC dikonversi ke MM / hh / tttt. Misalnya, mengirimkan panggilan ke tindakan dengan string '09 / 02/2009 'menghasilkan DateTime dari '02 / 09/2009 00:00:00', atau 2 September di pengaturan lokal kami.
Saya tidak ingin menggulung binder model saya sendiri demi format tanggal. Tapi sepertinya tidak perlu harus mengubah tindakan untuk menerima string dan kemudian gunakan DateTime.Parse jika MVC mampu melakukan ini untuk saya.
Apakah ada cara untuk mengubah format tanggal yang digunakan dalam binder model default untuk DateTime? Bukankah seharusnya pengikat model default menggunakan pengaturan lokalisasi Anda?
sumber
Jawaban:
Saya baru saja menemukan jawaban untuk ini dengan beberapa googling yang lebih lengkap:
Melvyn Harbor memiliki penjelasan menyeluruh tentang mengapa MVC bekerja dengan tanggal seperti yang dilakukannya, dan bagaimana Anda dapat menimpanya jika diperlukan:
http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx
sumber
MM/dd/yyyy
format lain yang menunjukkan kesalahan validasiThe field BeginDate must be a date.
, bagaimana saya bisa memutuskan untuk menerimadd/MM/yyyy
format?Saya akan mengatur budaya Anda secara global. ModelBinder ambil itu!
Atau Anda hanya mengubah ini untuk halaman ini.
Tetapi secara global di web.config saya pikir lebih baik
sumber
Saya telah mengalami masalah yang sama dengan format tanggal pendek yang mengikat ke properti model DateTime. Setelah melihat banyak contoh yang berbeda (tidak hanya mengenai DateTime) saya mengumpulkan follwing:
Agar tetap seperti rute dll adalah regiseterd dalam file ASAX Global saya juga menambahkan kelas sytatic baru ke folder App_Start proyek MVC4 saya bernama CustomModelBinderConfig:
Saya kemudian panggil RegisterCustomModelBinders statis dari Global ASASX Application_Start saya seperti ini:
Catatan penting di sini adalah jika Anda menulis nilai DateTime ke bidang tersembunyi seperti ini:
Saya melakukan itu dan nilai aktual pada halaman itu dalam format "MM / hh / tttt hh: mm: ss tt" bukan "dd / MM / tttt hh: mm: ss tt" seperti yang saya inginkan. Ini menyebabkan validasi model saya gagal atau mengembalikan tanggal yang salah (jelas menukar nilai hari dan bulan sekitar).
Setelah banyak yang menggaruk-garuk kepala dan upaya yang gagal solusinya adalah mengatur info budaya untuk setiap permintaan dengan melakukan ini di Global.ASAX:
Ini tidak akan berfungsi jika Anda menempelkannya di Application_Start atau bahkan Session_Start karena itu menetapkannya pada utas saat ini untuk sesi. Seperti yang Anda ketahui, aplikasi web tidak memiliki kewarganegaraan sehingga utas yang melayani permintaan Anda sebelumnya adalah utas yang sama untuk melayani permintaan Anda saat ini, maka info kultur Anda telah mencapai GC hebat di langit digital.
Terima kasih buka: Ivan Zlatev - http://ivanz.com/2010/11/03/custom-model-binding-using-imodelbinder-in-asp-net-mvc-two-gotchas/
garik - https://stackoverflow.com/a/2468447/578208
Dmitry - https://stackoverflow.com/a/11903896/578208
sumber
Ini akan sedikit berbeda di MVC 3.
Misalkan kita memiliki pengontrol dan tampilan dengan metode Get
Kita harus menambahkan ModelBinder
dan perintah di Application_Start () dari Global.asax
sumber
IModelBinder
, terutama mengenai validasi. Juga, ini hanya berfungsi jika nama dateTimeDateTime
adalah .DateTime?
s hanya bekerja jika Anda menambahkan panggilan lain untukModelBinders.Binders.Add
dengantypeof(DateTime?)
.Perlu dicatat bahwa bahkan tanpa membuat model Anda sendiri, banyak format yang berbeda dapat diuraikan.
Misalnya di AS semua string berikut ini setara dan secara otomatis terikat dengan nilai DateTime yang sama :
Saya sangat menyarankan menggunakan yyyy-mm-dd karena jauh lebih portabel. Anda benar-benar tidak ingin berurusan dengan menangani beberapa format terlokalisasi. Jika seseorang memesan penerbangan pada 1 Mei alih-alih 5 Januari, Anda akan memiliki masalah besar!
NB: Saya tidak jelas apakah yyyy-mm-dd secara universal diuraikan dalam semua budaya jadi mungkin seseorang yang tahu bisa menambahkan komentar.
sumber
Coba gunakan toISOString (). Ini mengembalikan string dalam format ISO8601.
DAPATKAN metode
javascript
c #
Metode POST
javascript
c #
sumber
Saya mengatur konfigurasi di bawah ini pada MVC4 saya dan itu berfungsi seperti pesona
sumber
sumber
sumber
Saya mengatur
CurrentCulture
danCurrentUICulture
pengontrol basis kustom sayasumber