@ Html.DisplayFor - DateFormat ("aa / gg / yyyy")


90

mm/dd/yyyyTarih formatına sahip olmasını istediğim aşağıdaki jilet koduna sahibim :

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

Çok sayıda farklı yaklaşım denedim ama bu yaklaşımların hiçbiri benim durumumda işe yaramıyor

Denetim Tarihim bir DateTime?tür

Bunun gibi bir şey denedim ve şu hatayı aldım:

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

Ek bilgiler: Şablonlar yalnızca alan erişimi, özellik erişimi, tek boyutlu dizi dizini veya tek parametreli özel dizin oluşturucu ifadeleriyle kullanılabilir.

Bunu denedim:

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

'ToString' yöntemi için aşırı yükleme yok 1 bağımsız değişken alıyor

Yanıtlar:


164

Eğer kullanırsanız DisplayFor, o zaman ya aracılığı biçimini tanımlamak zorunda DisplayFormatözelliğin veya özel gösterim şablonu kullanın. (Ön ayarların tam listesi buradaDisplayFormatString bulunabilir .)

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

Veya görünümü oluşturun Views\Shared\DisplayTemplates\DateTime.cshtml:

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

Bu DateTime, zamanı kodladığınız bile olsa tüm e'ler için geçerli olacaktır . Eğer sadece tarih okunur özelliklerine uygulamak istiyorsanız, o zaman kullanabilir Views\Shared\DisplayTemplates\Date.cshtmlve DataTypemülkünüzdeki Özellik:

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

Son seçenek, DisplayFormülkü kullanmamak ve bunun yerine doğrudan oluşturmaktır:

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

Önerdiğiniz gibi bir displayTemplate oluşturdum ve şablondaki kodu kopyalayıp yapıştırdığımda bu hatayı alıyorumNo overload for method 'ToString' takes 1 arguments
Nick Kahn

4
Bence bu olmalı[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]

[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] Türkiye için çalıştı, teşekkürler
zapoo

@Mac: Ne demek istiyorsun? Çok işe yarıyorlar, ama belki de sizin özel senaryonuzda değil. Daha fazla bilgi olmadan durumunuzun ne olduğunu söyleyemem.
Chris Pratt

Eğer editör lutfen formatını kullanmak istiyorsanız, ekleme ApplyFormatInEditMode = trueözelliğine: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Açık olmalı, ancak boşa harcayacak zamanınız olmadığında, intellisense'den gelen ipucu benimki gibi burnunuzu
geçebilir

19

Bu model özelliğinin değerini basitçe çıkarıyorsanız, DisplayForhtml yardımcısına ihtiyacınız yoktur, doğrudan uygun dize biçimlendirmesiyle çağırın .

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

Çıktı gerekir

Audit Date: 1/21/2015

Son olarak, denetim tarihiniz boş olabilir, bu nedenle, null yapılabilir bir değeri biçimlendirmeye çalışmadan önce koşullu denetimi yapmalısınız.

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

Aldığınız hatayı Google'da araştırmak, bu cevabı sağlar ; bu, hatanın Html yardımcılarınızdaki Model kelimesini kullanmaktan kaynaklandığını gösterir. Örneğin, kullanarak @Html.DisplayFor(Model=>Model.someProperty). ModelÖrneğin, başka bir şey kullanmak için bunları @Html.DisplayFor(x=>x.someProperty)değiştirin : veya bu yardımcılarda başkenti Mküçük harfe mçevirin.


1
eğer kullanırsam @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 - hala bunu Html.DisplayForyardımcıya koymaya çalışıyorsun gibi geliyor . Bunu yapma. Ayrıca, DisplayForyardımcıyı kullanmaya çalıştığınız başka bir özelliği değil de, hatayı bu satıra attığından emin misiniz ?
Tommy

Kullandıysam @Model...şu hatayı alıyorum: 'Model' bildirimi ile çakışıyor System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn

@AbuHamzah Lütfen güncellenmiş cevabımın son paragrafına bakınız.
Tommy

11

Bu değişikliği kodumda kullanıyorum:

eski kod:

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

yeni :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>

... ve? Bu bir cevap mı yoksa ne?
Maciej Jureczko

Evet, konuya göre basitçe çözümdür. Bunun birine yardımcı olabileceğini düşündüm.
Piotr Mirek

Tamam, "Bu değişikliği kodumda kullanıyorum" ifadesini özellikle bunun bir çözüm olduğunu belirten bir şeye değiştirmenizi öneririm.
Maciej Jureczko

Basit ve kullanışlı cevap, benim için çalıştı teşekkürler !!
Tarayıcı

Dataakt DateTime türünde ise sorun mu var?
Emanuele


5

Benzer şeyi şu şekilde uyguladım:

  1. Tarihi gerekli formatta görüntülemek ve alanı salt okunur hale getirmek için TextBoxFor kullanın .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Css'de TextBox'a sıfır anahat ve sıfır kenarlık verin .

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

Ve ...... Bitti :)


1
Ama neden böyle yapıyorsun?
CodeCaster

Çünkü diğer yöntemlerden herhangi biri benim için işe yaramadı ve bana çok fazla kodlama kazandırdı. Ayrıca, sonuç salt okunurdur ve kenarlığı yoktur, bu nedenle metin kutusu gibi görünmemiştir.
Akshat

5

Bu formatı tüm proje için uygulamak istediğiniz için görünüm modelinizde [ DisplayFormat ] özniteliğini kullanabilirsiniz .

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

4

Benim için kullanmak yeterliydi

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

2

Bazı kazma sonra ben ayar bitti Thread'ın CurrentCulture olması değerini CultureInfo ( 'en-us') kontrolörün eylem yönteminde:

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

Bu ayarın her görünümde olmasını istiyorsanız, işte bazı diğer seçenekler .

Hakkında CurrentCultureözellik değeri:

Cultureınfo birlikte ilişkili nesneler ile bu özelliği tarafından döndürülen nesne, tarih, saat, sayı, para birimi değerlerinin, metnin sıralama düzenine, Çakma sözleşmeler ve dize karşılaştırmaları için varsayılan biçimini belirler.

Kaynak: MSDN CurrentCulture

Not: Önceki CurrentCultureözellik ayarı, kontrolör zaten CultureInfo("en-US")tarih formatının olduğu yerde veya benzeriyle çalışıyorsa muhtemelen isteğe bağlıdır "MM/dd/yyyy".

CurrentCultureÖzelliği ayarladıktan sonra "M/d/yyyy", görünümde tarihi biçime dönüştürmek için kod bloğu ekleyin :

@{  //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

Yukarıdaki @shortDateLocalFormatdeğişken ToString("M/d/yyyy")eserlerle formatlanmıştır . Eğer ToString("MM/dd/yyyy")kullanılırsa Ben ilk yaptığım gibi, o zaman sahip sonunda sıfır sorunu lider . Ayrıca Tommy'nin önerdiği gibi ToString("d")çalışıyor. Aslında "Kısa tarih kalıbı""d" anlamına gelir ve farklı kültür / dil biçimleriyle de kullanılabilir.

Sanırım yukarıdaki kod bloğu, bazı harika yardımcı yöntem veya benzeri ile de ikame edilebilir .

Örneğin

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

    @shortDateLocalFormat
}

bu yardımcı çağrı ile kullanılabilir

@DateFormatter(Model.AuditDate)

Update , DateTime.ToString (String, IFormatProvider) yöntemi kullanıldığında aynı şeyi yapmanın alternatif bir yolu olduğunu öğrendim . Bu yöntem kullanıldığında, Thread's CurrentCultureözelliğini kullanmaya gerek yoktur . CultureInfo("en-US")> - ikinci bağımsız değişken olarak geçirilir IFormatProvider için DateTime.ToString(String, IFormatProvider)yöntem.

Değiştirilmiş yardımcı yöntem:

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

    @shortDateLocalFormat
}

.NET Fiddle


1

Belki basitçe dene

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

ayrıca .ToString ("dd MMM, yyyy") .ToString ("d") vb. gibi birçok dize biçimi türü kullanabilirsiniz.


hatayı alma: 'Model', 'System.Web.Mvc.WebViewPage <TModel> .Model' bildirimi ile çakışıyor
Nick Kahn

kullanırsam @modeltanımıyor
Nick Kahn

@AbuHamzah - Yanıldım M, HTML sayfasında kullanırken bir başkent , mbeyan ederken küçük harf .
Tommy

hala hatayı alıyorum, lütfen Tommy'nin cevabına yanıt veriyorum
Nick Kahn

1
No overload for method 'ToString' takes 1 argumentskullandığım zaman şikayet ediyorumToString("mm/dd/yyyy")
Nick Kahn

1

Görünümde Bunu değiştirin:

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

İle:

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

Açıklama: AuditDate değeri boş değilse, tarihi gg / AA / yyyy olarak biçimlendirecektir, aksi takdirde değeri olmadığı için olduğu gibi bırakacaktır.


0

Denetleyicimde benzer bir sorun yaşadım ve işte benim için işe yarayan şey:

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

"DateSigned" benim modelimdeki değerdir Satırda, model değerinin bir değeri varsa değeri biçimlendirin, aksi takdirde hiçbir şey göstermeyin.

umarım yardımcı olur


0

Bu, basit bir tarih dizesi almanın en iyi yoludur:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()

İşte bu cevabın yaptığı şey: HtmlStringçıktıyı alır , a'ya DisplayFordönüştürür, a Stringolarak ayrıştırır DateTime, sonra bunu a olarak biçimlendirir String. Bence gereksiz derecede karmaşık.
Heretic Maymun

0

Dönüştür'ü kullanabilirsiniz

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

-1

Bkz bu cevabı hakkında No overload for method 'ToString' takes 1 argumentshata.

Boş değer atanabilir bir DateTime biçimlendiremezsiniz - DateTime.Value özelliğini kullanmanız gerekir.

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

İpucu: Bu şeyleri bir görünüme koymadan önce intellisense ile standart bir sınıfta çözmek her zaman yararlıdır. Bu durumda, bir sınıfta fark edilmesi kolay olan bir derleme hatası alırsınız.


önerilen kodu kullanırsam bu hatayı alıyorum 'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.