@ Html.DisplayFor - DateFormat („mm / dd / rrrr”)

88

Mam następujący kod maszynki do golenia, który chcę mieć mm/dd/yyyyformat daty:

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

Wypróbowałem wiele różnych podejść, ale żadne z nich nie działa w mojej sytuacji

moja AuditDate to DateTime? typ

Próbowałem czegoś takiego i otrzymałem ten błąd:

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

Informacje dodatkowe: szablonów można używać tylko z dostępem do pól, dostępem do właściwości, indeksem tablicy jednowymiarowej lub niestandardowymi wyrażeniami indeksatora z jednym parametrem.

Próbowałem tego:

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

Brak przeciążenia metody „ToString” przyjmuje 1 argument

Nick Kahn
źródło

Odpowiedzi:

161

Jeśli używasz DisplayFor, musisz zdefiniować format za pomocą DisplayFormatatrybutu lub użyć niestandardowego szablonu wyświetlania. (Pełną listę presetów DisplayFormatStringmożna znaleźć tutaj ).

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

Lub utwórz widok Views\Shared\DisplayTemplates\DateTime.cshtml:

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

Dotyczy to jednak wszystkich DateTime, nawet tych, w których kodujesz czas. Jeśli chcesz go zastosować tylko do właściwości wyłącznie datę, a następnie użyć Views\Shared\DisplayTemplates\Date.cshtml, a DataTypeatrybut nieruchomości:

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

Ostatnią opcją jest nieużywanie DisplayFori bezpośrednie renderowanie właściwości:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Chris Pratt
źródło
Utworzyłem displayTemplate zgodnie z twoją sugestią, a kiedy kopiuję i wklejam kod, który masz w szablonie, pojawia się ten błądNo overload for method 'ToString' takes 1 arguments
Nick Kahn
3
Myślę, że tak powinno być[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] pracował dla Turcji, dzięki
zapoo,
@Mac: Co masz na myśli? Oni bardzo dużo zrobić pracę, ale może po prostu nie w konkretnej sytuacji. Bez dodatkowych informacji nie mogę powiedzieć, jaka jest twoja sytuacja.
Chris Pratt
Jeśli chcesz redaktor użyć formatu aswell, dodać ApplyFormatInEditMode = truedo nieruchomości: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. To powinno być oczywiste, ale kiedy nie ma czasu na zmarnowanie-skopiuj-wklej, podpowiedź Intellisense może przejść przez nos, tak jak ja :)
Heki
19

Jeśli po prostu wyprowadzasz wartość tej właściwości modelu, nie potrzebujesz DisplayForpomocnika html, po prostu wywołaj go bezpośrednio z odpowiednim formatowaniem ciągu .

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

Powinien wyjść

Audit Date: 1/21/2015

Wreszcie data audytu może być zerowa, dlatego przed podjęciem próby sformatowania wartości zerowej należy wykonać sprawdzenie warunkowe.

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

Wygooglowanie otrzymywanego błędu zapewnia tę odpowiedź , która pokazuje, że błąd wynika z użycia słowa Model w pomocnikach HTML. Na przykład użycie @Html.DisplayFor(Model=>Model.someProperty). Zmień je, aby użyć czegoś innego niż Modelna przykład: @Html.DisplayFor(x=>x.someProperty)lub zmień wielką Mliterę na małą literę mw tych pomocnikach.

Tommy
źródło
jeśli użyłem @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 - brzmi, jakbyś wciąż próbował umieścić to w Html.DisplayForpomocniku. Nie rób tego. Czy na pewno zgłasza błąd w tej linii, a nie w jakiejś innej właściwości, na której próbujesz użyć DisplayForpomocnika?
Tommy
Jeśli użyłem @Model..., otrzymuję ten błąd: `` Model '' jest w konflikcie z deklaracją System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn
@AbuHamzah Proszę zobaczyć ostatni akapit mojej zaktualizowanej odpowiedzi.
Tommy
11

Używam tej zmiany w moim kodzie:

stary kod:

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

Nowy :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Piotr Mirek
źródło
... i? Czy to odpowiedź, czy co?
Maciej Jureczko
Tak, to po prostu rozwiązanie problemu z tematu. Pomyślałem, że to może być pomocne dla kogoś.
Piotr Mirek
OK, proponuję zmienić „Używam tej zmiany w moim kodzie” na coś konkretnie stwierdzającego, że jest to rozwiązanie.
Maciej Jureczko
Prosta i wygodna odpowiedź, działała dla mnie dzięki!
Scanner
6

Odpowiedź @ ChrisPratt na temat korzystania z szablonu wyświetlania jest błędna. Prawidłowy kod, aby to działało, to:

@model DateTime?

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

Dzieje się tak, ponieważ .ToString()for Nullable<DateTime>nie akceptuje Formatparametru .

Leonel Sanches da Silva
źródło
5

Zaimplementowałem podobną rzecz w ten sposób:

  1. Użyj TextBoxFor, aby wyświetlić datę w wymaganym formacie i ustawić pole jako tylko do odczytu .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Daj zerowy kontur i zerowe obramowanie do TextBox w css.

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

I ...... Gotowe :)

Akszat
źródło
1
Ale dlaczego miałbyś to zrobić w ten sposób?
CodeCaster
Ponieważ żadna z innych metod nie zadziałała i zaoszczędziła mi wiele czasu na kodowaniu. Ponadto wynik końcowy jest przeznaczony tylko do odczytu i nie ma obramowania, więc nie wyglądał jak pole tekstowe.
Akshat
4

Dla mnie to wystarczyło

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
DmitryBoyko
źródło
4

Możesz użyć atrybutu [ DisplayFormat ] w swoim modelu widoku, ponieważ chcesz zastosować ten format do całego projektu.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Aung San Myint
źródło
2

Po pewnym kopania i skończyło się na ustawienie Thread„s CurrentCulture wartość mają CultureInfo («en-us») w sposobie działania kontrolera:

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

Oto kilka innych opcji jeśli chcesz mieć to ustawienie w każdym widoku.

O CurrentCulturewartości nieruchomości:

Obiekt CultureInfo, który jest zwracany przez tę właściwość, wraz ze skojarzonymi z nim obiektami, określają domyślny format dat, godzin, liczb, wartości walutowych, kolejności sortowania tekstu, konwencji wielkości liter i porównań ciągów.

Źródło: MSDN CurrentCulture

Uwaga: poprzednie CurrentCultureustawienie właściwości jest prawdopodobnie opcjonalne, jeśli kontroler jest już uruchomiony z CultureInfo("en-US")lub podobnym, gdzie jest format daty"MM/dd/yyyy" .

Po ustawieniu CurrentCulturewłaściwości dodaj blok kodu, aby przekonwertować datę na "M/d/yyyy"format w widoku:

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

Powyżej @shortDateLocalFormatzmienna jest sformatowana za pomocą ToString("M/d/yyyy")dzieł. Jeśli ToString("MM/dd/yyyy")jest używane, tak jak zrobiłem to na początku, w końcu masz zerowy problem . Działa też polecany przez Tommy'ego ToString("d") . Właściwie "d"oznacza „Wzorzec daty krótkiej” i może być również używany z różnymi formatami kulturowymi / językowymi.

Myślę, że powyższy blok kodu można również zastąpić jakąś fajną metodą pomocniczą lub podobną.

Na przykład

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

    @shortDateLocalFormat
}

może być używany z tym wywołaniem pomocnika

@DateFormatter(Model.AuditDate)

Aktualizacja , dowiedziałem się, że istnieje alternatywny sposób zrobienia tego samego, gdy używana jest metoda DateTime.ToString (String, IFormatProvider) . Przy zastosowaniu tej metody to nie ma potrzeby korzystania z Thread„s CurrentCulturenieruchomości. Wartość CultureInfo("en-US")jest przekazywana jako drugi argument -> IFormatProvider do DateTime.ToString(String, IFormatProvider)metody.

Zmodyfikowana metoda pomocnicza:

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

    @shortDateLocalFormat
}

.NET Fiddle

jyrkim
źródło
1

Może po prostu spróbuj

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

możesz również użyć wielu typów formatów ciągów, takich jak .ToString ("dd MMM, yyyy") .ToString ("d") itp.

Wiizl
źródło
otrzymywanie błędu: „Model” jest w konflikcie z deklaracją „System.Web.Mvc.WebViewPage <TModel> .Model”
Nick Kahn
gdybym @modelgo użył , nie rozpoznaje
Nick Kahn
@AbuHamzah - pomyliłem się, jest to duża litera Mpodczas używania na stronie HTML, małe litery mpodczas deklarowania.
Tommy
nadal otrzymuję błąd, zobacz Odpowiadam na odpowiedź Tommy'ego
Nick Kahn
1
No overload for method 'ToString' takes 1 argumentsnarzekam, kiedy używamToString("mm/dd/yyyy")
Nick Kahn
1

W widoku Zamień to:

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

Z:

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

Objaśnienie: Jeśli wartość AuditDate nie jest pusta, data zostanie sformatowana na dd / MM / rrrr, w przeciwnym razie pozostaw ją taką, jaka jest, ponieważ nie ma wartości.

user2298633
źródło
0

Miałem podobny problem z kontrolerem i oto, co zadziałało:

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

„DateSigned” to wartość z mojego modelu. Linia czyta, jeśli wartość modelu ma wartość, sformatuj ją, w przeciwnym razie nic nie pokaż.

Mam nadzieję, że to pomoże

user3170254
źródło
0

To najlepszy sposób na uzyskanie prostego ciągu daty:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ahmad fatemh
źródło
Oto, co robi ta odpowiedź: pobiera dane HtmlStringwyjściowe przez DisplayFor, konwertuje je na a String, analizuje je jako a DateTime, a następnie formatuje jako plik String. Moim zdaniem niepotrzebnie skomplikowane.
Heretic Monkey,
0

Możesz użyć Convert

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

Zobacz tę odpowiedź dotyczącą No overload for method 'ToString' takes 1 argumentsbłędu.

Nie można sformatować DateTime dopuszczającej wartość null - należy użyć właściwości DateTime.Value.

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

Wskazówka: zawsze warto rozpracować te rzeczy na standardowej klasie z inteligencją, zanim umieścisz je w widoku. W takim przypadku wystąpiłby błąd kompilacji, który byłby łatwy do wykrycia w klasie.

NightOwl888
źródło
jeśli użyję sugerowanego kodu, otrzymam ten błąd'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn