ASP.NET MVC 3'te belirli bir biçimde DateTime nasıl oluşturulur?


117

Model sınıfımda bir tür özelliği varsa, DateTimeonu belirli bir formatta - örneğin ToLongDateString()dönen formatta - nasıl işleyebilirim ?

Bunu denedim ...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

... ifade bir özelliğe veya alana işaret etmesi gerektiğinden bir istisna atar. Ve bu...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

... bu bir istisna oluşturmaz, ancak işlenen çıktı boştur ( valhata ayıklayıcıda görebildiğim gibi beklenen değeri içermesine rağmen ).

Önceden ipuçları için teşekkürler!

Düzenle

ToLongDateStringsadece bir örnektir. Bunun yerine kullanmak istediğim ToLongDateStringşey özel bir uzatma yöntemi DateTimeve DateTime?:

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

Dolayısıyla, ViewModel özelliklerinde DisplayFormatözniteliği ve DataFormatStringparametreyi kullanamayacağımı düşünüyorum .

Yanıtlar:


159

Tek yapmak istediğiniz tarihi belirli bir formatta görüntülemekse, şunu arayın:

@String.Format(myFormat, Model.MyDateTime)

Kullanmak @Html.DisplayFor(...), bir şablon belirtmediğiniz veya şablonlar üzerine kurulu bir şeyi, bir IEnumerable<T>. Bir şablon oluşturmak yeterince basittir ve çok fazla esneklik sağlayabilir. Adlı mevcut denetleyici (veya paylaşılan görünümler klasörü) için görünümler klasörünüzde bir klasör oluşturun DisplayTemplates. Bu klasörün içine, şablonu oluşturmak istediğiniz model tipiyle kısmi bir görünüm ekleyin. Bu durumda /Views/Shared/DisplayTemplatesadlı bir kısmi görünüm ekledim ve ekledim ShortDateTime.cshtml.

@model System.DateTime

@Model.ToShortDateString()

Ve şimdi bu şablonu aşağıdaki satırla çağırabilirsiniz:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

Teşekkürler, bu iyi görünüyor ve bu şablon parametresi ("ShortDateTime"), ataddeini yanıtına yaptığım yorumda anlattığım sorunu da çözüyor.
Slauma

3
Tür "DateTime?" İse "DateTime" (@model DateTime?) yerine ... ciplay şablonu null yapılabilir veya null yapılamaz tarih saatlerini işleyecektir. Dosyanın adı "DateTime.cshtml" olarak kalmalıdır.
Romias

+1 Buna yorum yapmak zorunda kaldım, uygulamamda harika çalıştı! Teşekkürler!
Russell Christensen

@ Html.DisplayFor () kullanmak fazladan bir iş değildir, modelin html temsilini şablonlar olmadan da işler .... kafanız karışmasın ...
Cabuxa.Mapache

stackoverflow.com/questions/19920603/… , @Romias bahseden null yapılabilir veri zamanlarıyla başa çıkmada yardımcı olan kodu içerir.
Walter de Jong

171

Görünüm modeli mülkünüzü şu [DisplayFormat]öznitelikle dekore edebilirsiniz :

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
               ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }

ve size göre:

@Html.EditorFor(x => x.MyDate)

veya değeri görüntülemek için,

@Html.DisplayFor(x => x.MyDate)

Önermediğim başka bir olasılık, zayıf yazılmış bir yardımcı kullanmaktır:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

1
@Darin: Bir giriş öğesi istemiyorum, yalnızca statik metin çıktısı istiyorum. Ayrıca gerçek biçimin DateTime(ToLongDateString yalnızca bir örnekti) özel bir uzantı yöntemi tarafından oluşturulduğunu da belirtmeliyim , bu yüzden kullanmam pek olası değil DataFormatString.
Slauma

2
@Slauma, ne dersin @Html.DisplayFor(x => x.MyDateTime). @NickLarsen, görünüm modellerinin kullanılmasının nedeni budur. Örneğimde görünüm modelini bu öznitelikle dekore ediyorum ve bir görünüm zaten belirli bir görünüme bağlı, amacı bu.
Darin Dimitrov

1
@Slauma, tamam, bu durumda ya özel bir görüntü şablonu kullanabilir ya da görünüm modelinizin bir dize özelliği kullanmasını sağlayabilirsiniz ve model ile görünüm modeli arasında eşleme yaptığınızda dönüştürme eşleme katmanında yapılır (bu şekilde yine de görünümde yalnızca Html.DisplayFor kullanın).
Darin Dimitrov

5
@NickLarsen, hayır, görünüm başına bir görünüm modeli. İnsanların bu hatayı yapmasının nedeni, bazı özellikleri bir denetleyici eyleminde doğrulamadan diğerinde değil de nasıl dışlayabilirim? SO'da çok yaygındır.
Darin Dimitrov

1
Bir yıl sonra bu soruya geri dönersek, görünüm başına bir model argümanına katılıyorum. Yine de ekran seçenekleriyle ilgili her şeyin modele değil, görünüme ait olduğunu düşünüyorum.
Nick Larsen

26

Modelin içinde basit biçimlendirilmiş çıktı

@String.Format("{0:d}", model.CreatedOn)

veya foreach döngüsünde

@String.Format("{0:d}", item.CreatedOn)

Kabul edilen yanıtın bir kopyası gibi görünüyorstring.Format
Paul Tyng

2
@PaulTyng bu cevap benim için kabul edilen cevaptan daha netti, odesuk aslında formatı ilk parametrede gösterdi ve bu da bir newb olarak bana yardımcı oldu.
Dan Beaulieu

1
Katılıyorum, bana yardımcı olan cevap bu.
glenn garson

26

Satır içi biçim ve modelden bir tarih özelliği görüntülemek için aşağıdaki yaklaşımı kullanıyorum.

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

Aksi takdirde, bir Metin Kutusu veya Düzenleyici'yi doldururken @Darin'in önerdiği gibi, niteliği bir [DisplayFormat]öznitelikle süsleyebilirsiniz .


Aradığım çözüm bu!
Envil

Aradığım çözüm bu!
Raihan Ridoy

9

Tüm DateTimetürleriniz aynı şekilde oluşturulursa, özel bir DateTimegörüntü şablonu kullanabilirsiniz.

Görünümler klasörünüzde, denetleyiciye özel görünümler klasörünüzün altında veya "Paylaşılan" klasörün altında "DisplayTemplates" adlı bir klasör oluşturun (bunlar, kısmi dosyalara benzer şekilde çalışır).

İçinde adlı bir dosya oluşturmak DateTime.cshtmlalır DateTimeolarak @modelsize tarihini işlemek istiyorum nasıl ve kod:

@model System.DateTime
@Model.ToLongDateString()

Şimdi bunu sadece görünümlerinizde kullanabilirsiniz ve çalışmalıdır:

@Html.DisplayFor(mod => mod.MyDateTime)

"DisplayTemplates" klasörüne ekleme ve dosyayı görüntülediğiniz türle eşleşecek şekilde adlandırma kuralını takip ettiğiniz sürece, MVC, değerlerinizi görüntülemek için bunu otomatik olarak kullanacaktır. Bu aynı zamanda "EditorTemplates" kullanarak senaryoları düzenlemek için de işe yarar.

İşte şablonlarla ilgili daha fazla bilgi .


Teşekkürler, daha yeni test ettim ve eğer tür gerçekten ise iyi çalışıyor DateTime. Ancak, birkaç boş değer atanabilir DateTime özelliğim var. DisplayTemplatesKlasörde NullableDateTime.cshtmlve içinde adlı ikinci bir dosya oluşturmaya çalıştım : @using MyHelpers @model System.DateTime? @Model.MyCustomExtension()İşte MyCustomExtensionbir uzantı yöntemi DateTime?. Ancak bir DateTime olduğunda bir istisna olur? alanı gerçekten boş, sözlüğün DateTimeboş olmayan bir tür model öğesi gerektirdiğini söylüyor . Boş değer atanabilir bir DateTime için bir DisplayTemplate tanımlamanın bir yolu var mı?
Slauma

@Slauma: Hmm, güzel soru. Muhtemelen NullableDateTime.cshtml@ NickLarsen'in önerdiği ve kullandığı yaklaşıma sadık kalır ve kullanırdım @Html.DisplayFor(m => m.MyDateTime, "NullableDateTime").
ataddeini

DateTime.cshtml şablonunuz "@model DateTime?" Olarak ayarlanmışsa, şablonun adını açıkça eklemenize gerek yoktur. "DateTime" yerine. Bu şekilde tüm Tarihler (boş
verilebilir

7

Tercihim, biçimlendirme ayrıntılarını görünüm modeli ile değil görünümde tutmaktır. Yani MVC4 / Razor'da:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

datetime format referansı: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

Sonra ona bağlı bir JQuery tarih seçici var ve bu da tarihi farklı bir formatta koyuyor ... doh!

Görünüşe göre tarih seçicinin biçimini aynı biçimlendirmeye ayarlamam gerekiyor.

Bu yüzden, System.Globalizationbiçimlendirmeyi bir data- * özniteliğinde depoluyorum ve bunu ayarlarken topluyorum

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

Ve işte berbat kısım: .net ve datepicker formatları eşleşmiyor, bu yüzden korsanlığa ihtiyaç var:

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

bu biraz zayıf, ancak birçok durumu kapsamalıdır.


İlk 3 satır en önemlisidir :) Örnek ve Biçim Tanımına bağlantı
Borik

2

benim için çalışıyor

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

Bu soru tabii ki jilet görüntüleme motorunu kullanıyor, farklı bir dil kullanarak cevapladınız.
Rhys Bevilaqua

2

Son zamanlarda aynı sorunu yaşadım.

Modelde DataType'ı basitçe Date olarak tanımlamanın da işe yaradığını keşfettim (Code First yaklaşımını kullanarak)

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


0

Tarihi kısa biçimde görüntülemek istersem, sadece @ Model.date.ToShortDateString () kullanırım ve tarihi


0

Tek yapmak istediğiniz tarihi belirli bir formatta görüntülemekse, şunu arayın:

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

Aşağıdaki formatta sonuçlanacaktır,

26-Apr-2013

04/26/13

@ Model.LeadDate == null olursa ne olur?
Bimal Das

0

bu, dd/MM/yyyyGörünümünüzde formatta görüntülenecektir

Görünümünde:

DisplayForbu kodu kullanmak yerine

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

tarih sütunundaki değerin boş olup olmadığını da kontrol eder, eğer doğruysa, o zaman Sütundan Tarih Boş veya gerçek biçimlendirilmiş tarihi görüntüler.

Umut birine yardım eder.


0
@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}


-2

Sadece Dosyayı Görüntüle Bu şekilde ayarlayın. Bunu deneyebilirsin.

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdatesizin olduğu DateTimetip verileri.

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.