@ Html.DisplayFor - DateFormat (“bb / hh / tttt”)

90

Saya memiliki kode pisau cukur berikut yang saya ingin mm/dd/yyyyformat tanggalnya:

Audit Date: @Html.DisplayFor(Model => Model.AuditDate)

Saya telah mencoba sejumlah pendekatan berbeda tetapi tidak ada pendekatan yang berhasil dalam situasi saya

AuditDate saya adalah sebuah DateTime?tipe

Saya telah mencoba sesuatu seperti ini dan mendapatkan kesalahan ini:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

Informasi tambahan: Template hanya dapat digunakan dengan akses kolom, akses properti, indeks array dimensi tunggal, atau ekspresi pengindeks kustom parameter tunggal.

Mencoba ini:

@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))

Tidak ada kelebihan beban untuk metode 'ToString' yang membutuhkan 1 argumen

Nick Kahn
sumber

Jawaban:

164

Jika Anda menggunakan DisplayFor, maka Anda harus menentukan format melalui DisplayFormatatribut atau menggunakan template tampilan kustom. (Daftar lengkap preset DisplayFormatStringdapat ditemukan di sini .)

[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }

Atau buat tampilan Views\Shared\DisplayTemplates\DateTime.cshtml:

@model DateTime?
@if (Model.HasValue)
{
    @Model.Value.ToString("MM/dd/yyyy")
}

Itu akan berlaku untuk semua DateTime, bahkan yang di mana Anda juga menyandikan waktu. Jika Anda ingin ini hanya berlaku untuk properti tanggal saja, maka gunakan Views\Shared\DisplayTemplates\Date.cshtmldan DataTypeatribut pada properti Anda:

[DataType(DataType.Date)]
public DateTime? AuditDate { get; set; }

Opsi terakhir adalah tidak menggunakan DisplayFordan malah merender properti secara langsung:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Chris Pratt
sumber
Saya telah membuat displayTemplate seperti yang Anda sarankan dan ketika saya menyalin dan menempelkan kode yang Anda miliki di template maka saya mendapatkan kesalahan iniNo overload for method 'ToString' takes 1 arguments
Nick Kahn
4
Saya pikir itu seharusnya[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] bekerja untuk Turki, terima kasih
zapoo
@ Mac: Apa maksud Anda? Mereka sangat banyak melakukan pekerjaan, tapi mungkin tidak dalam skenario spesifik Anda. Tanpa informasi lebih lanjut, saya tidak dapat mengatakan bagaimana situasi Anda.
Chris Pratt
Jika Anda ingin editor untuk menggunakan format juga, tambahkan ApplyFormatInEditMode = trueke properti: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Seharusnya sudah jelas, tetapi ketika Anda semua tidak membuang waktu untuk menyalin-tempel, petunjuk dari Intellisense mungkin melewati hidung Anda seperti halnya saya :)
Heki
19

Jika Anda hanya mengeluarkan nilai properti model itu, Anda tidak memerlukan DisplayForhelper html, cukup panggil langsung dengan pemformatan string yang tepat .

Audit Date: @Model.AuditDate.Value.ToString("d")

Haruskah keluaran

Audit Date: 1/21/2015

Terakhir, tanggal audit Anda bisa jadi nol, jadi Anda harus melakukan pemeriksaan bersyarat sebelum Anda mencoba memformat nilai nullable.

@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}

Googling kesalahan yang Anda dapatkan memberikan jawaban ini , yang menunjukkan bahwa kesalahan tersebut berasal dari menggunakan kata Model di pembantu Html Anda. Misalnya, menggunakan @Html.DisplayFor(Model=>Model.someProperty). Ubah ini untuk menggunakan sesuatu selain Model, misalnya: @Html.DisplayFor(x=>x.someProperty)atau ubah modal Mmenjadi huruf kecil mdi pembantu ini.

Tommy
sumber
1
jika saya menggunakan @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Nick Kahn
@AbuHamzah - sepertinya Anda masih mencoba memasukkan ini ke dalam Html.DisplayForhelper. Jangan lakukan itu. Juga, apakah Anda yakin bahwa ini melempar kesalahan pada baris itu dan bukan beberapa properti lain tempat Anda mencoba menggunakan DisplayForhelper?
Tommy
Jika saya menggunakan @Model...saya mendapatkan kesalahan ini: 'Model' bertentangan dengan deklarasi System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn
@AbuHamzah Silakan lihat paragraf terakhir dalam jawaban saya yang diperbarui.
Tommy
11

Saya telah menggunakan perubahan ini dalam kode saya:

kode lama:

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

baru:

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Piotr Mirek
sumber
... dan? Apakah ini jawaban atau apa?
Maciej Jureczko
Ya, ini hanyalah solusi untuk masalah dari subjek. Saya pikir ini mungkin berguna untuk seseorang.
Piotr Mirek
Oke, saya sarankan Anda mengubah "Saya telah menggunakan perubahan ini dalam kode saya" menjadi sesuatu yang secara khusus menyatakan bahwa ini adalah solusi.
Maciej Jureczko
Jawaban sederhana dan nyaman, berhasil untuk saya, terima kasih !!
Pemindai
Masalah jika dataakt berjenis DateTime?
Emanuele
6

Jawaban @ ChrisPratt tentang penggunaan Template Tampilan salah. Kode yang benar untuk membuatnya berfungsi adalah:

@model DateTime?

@if (Model.HasValue)
{
    @Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
}

Itu karena .ToString()for Nullable<DateTime>tidak menerima Formatparameter .

Leonel Sanches da Silva
sumber
5

Saya menerapkan hal serupa dengan cara ini:

  1. Gunakan TextBoxFor untuk menampilkan tanggal dalam format yang diperlukan dan membuat kolom hanya- baca .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Beri garis nol dan batas nol pada TextBox di css.

.my-style {
    outline: none;
    border: none;
}

Dan ...... Selesai :)

Akshat
sumber
1
Tapi kenapa kamu melakukannya seperti itu?
CodeCaster
Karena salah satu metode lain tidak berhasil untuk saya dan itu menghemat banyak pengkodean. Selain itu, hasil akhirnya hanya-baca dan tidak memiliki batas, sehingga tidak terlihat seperti kotak teks.
Akshat
5

Anda dapat menggunakan atribut [ DisplayFormat ] pada model tampilan Anda karena Anda ingin menerapkan format ini untuk keseluruhan proyek.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Aung San Myint
sumber
4

Bagi saya itu sudah cukup untuk digunakan

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
DmitryBoyko
sumber
2

Setelah beberapa menggali dan akhirnya aku menetapkan Thread's CurrentCulture nilai untuk memiliki CultureInfo ( 'en-US') dalam metode aksi kontroler:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

Berikut adalah beberapa opsi lain jika Anda ingin memiliki pengaturan ini di setiap tampilan.

Tentang CurrentCulturenilai properti:

The CultureInfo objek yang dikembalikan oleh properti ini, bersama-sama dengan benda-benda yang terkait, menentukan format default untuk tanggal, waktu, nomor, nilai mata uang, urutan pemilahan teks, konvensi casing, dan perbandingan string.

Sumber: MSDN CurrentCulture

Catatan:CurrentCulture Pengaturan properti sebelumnya mungkin opsional jika pengontrol sudah berjalan dengan CultureInfo("en-US")atau serupa di mana format tanggalnya "MM/dd/yyyy".

Setelah mengatur CurrentCultureproperti, tambahkan blok kode untuk mengubah tanggal ke "M/d/yyyy"format dalam tampilan:

@{  //code block 
    var shortDateLocalFormat = "";
    if (Model.AuditDate.HasValue) {
       shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
       //alternative way below
       //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
    }
}

@shortDateLocalFormat

Di atas @shortDateLocalFormatvariabel diformat dengan ToString("M/d/yyyy")karya. Jika ToString("MM/dd/yyyy")digunakan, seperti yang saya lakukan pertama kali maka Anda akhirnya memiliki masalah nol . Juga seperti yang direkomendasikan oleh Tommy ToString("d") bekerja juga. Sebenarnya "d"adalah singkatan dari "Pola tanggal pendek" dan dapat digunakan dengan format budaya / bahasa yang berbeda juga.

Saya kira blok kode dari atas juga dapat diganti dengan beberapa metode pembantu keren atau serupa.

Sebagai contoh

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {     
        shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
     }

    @shortDateLocalFormat
}

dapat digunakan dengan panggilan pembantu ini

@DateFormatter(Model.AuditDate)

Pembaruan , saya menemukan bahwa ada cara alternatif untuk melakukan hal yang sama ketika metode DateTime.ToString (String, IFormatProvider) digunakan. Ketika metode ini digunakan maka tidak perlu menggunakan Thread's CurrentCultureproperti. The CultureInfo("en-US")dilewatkan sebagai argumen kedua -> IFormatProvider ke DateTime.ToString(String, IFormatProvider)metode.

Metode pembantu yang dimodifikasi:

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {
       shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
    }

    @shortDateLocalFormat
}

.NET Fiddle

jyrkim.dll
sumber
1

Mungkin coba saja

@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)

Anda juga dapat menggunakan banyak jenis format string seperti .ToString ("dd MMM, yyyy") .ToString ("d") dll

Wiizl
sumber
mendapatkan kesalahan: 'Model' bertentangan dengan deklarasi 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn
jika saya menggunakannya @modeltidak mengenali
Nick Kahn
@AbuHamzah - Saya salah, itu modal Msaat menggunakan di halaman HTML, huruf kecil msaat mendeklarasikan.
Tommy
masih mendapatkan kesalahan, silakan lihat Saya membalas jawaban Tommy
Nick Kahn
1
No overload for method 'ToString' takes 1 argumentsmengeluh ketika saya menggunakanToString("mm/dd/yyyy")
Nick Kahn
1

Dalam Tampilan Ganti ini:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

Dengan:

@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}

Penjelasan: Jika nilai AuditDate bukan null maka itu akan memformat tanggal menjadi hh / MM / yyyy, jika tidak biarkan seperti itu karena tidak memiliki nilai.

pengguna2298633
sumber
0

Saya memiliki masalah serupa pada pengontrol saya dan inilah yang berhasil untuk saya:

model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""

"DateSigned" adalah nilai dari model saya. Garis berbunyi, jika nilai model memiliki nilai, maka format nilainya, jika tidak, tidak menampilkan apa pun.

Semoga membantu

pengguna3170254
sumber
0

Ini adalah cara terbaik untuk mendapatkan string tanggal sederhana:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ahmad fatemh
sumber
Inilah yang dilakukan jawaban ini: mengambil HtmlStringoutput dengan DisplayFor, mengubahnya menjadi a String, menguraikannya sebagai a DateTime, lalu memformatnya sebagai a String. Tak perlu rumit, menurut saya.
Heretic Monkey
0

Anda bisa menggunakan Convert

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 
Karthik
sumber
-1

Lihat jawaban tentang No overload for method 'ToString' takes 1 argumentskesalahan ini.

Anda tidak dapat memformat DateTime nullable - Anda harus menggunakan properti DateTime.Value.

@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty

Tip: Itu selalu membantu untuk mengerjakan hal-hal ini di kelas standar dengan intellisense sebelum menampilkannya. Dalam hal ini, Anda akan mendapatkan kesalahan kompilasi yang mudah dikenali di kelas.

NightOwl888
sumber
jika saya menggunakan kode yang disarankan maka mendapatkan kesalahan ini'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn