2015-01-23 14 views
49

Ich habe folgenden Rasierapparat Code, den ich mm/dd/yyyy Datumsformat haben will:@ Html.DisplayFor - Dateformat („mm/tt /“)

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

Ich habe versucht, Reihe verschiedenen Ansätze, aber keinen von dass nähert sich Arbeiten in meiner Situation

mein Auditdate ist ein DateTime? Typ

habe ich versucht, so etwas wie dieses und bekam diesen Fehler:

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

Weitere Informationen: Vorlagen können nur mit Feldzugriff, Eigenschaftenzugriff, eindimensionalem Arrayindex oder benutzerdefinierten benutzerdefinierten Indexerausdrücken verwendet werden.

dies versucht:

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

Keine Überlastung bei der Methode ‚ToString‘

1 Argumente nimmt

Antwort

13

Wenn Sie einfach den Wert dieses Modells Eigenschaft ausgeben, die Sie nicht brauchen die DisplayFor html-Helfer, rufen Sie es einfach direkt mit der proper string formatting.

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

Sollte Ausgabe

Audit Date: 1/21/2015

Schließlich Ihr Audittermin null sein könnte, so dass Sie den bedingten Scheck tun sollen, bevor Sie einen Nullable-Wert zu formatieren versuchen.

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

googeln den Fehler, den Sie provides this answer bekommen, was zeigt, dass der Fehler von der Verwendung des Wortes Modell in Ihren HTML-Helfer ist. Zum Beispiel mit @Html.DisplayFor(Model=>Model.someProperty). Ändern Sie diese, um etwas anderes als Model zu verwenden, zum Beispiel: @Html.DisplayFor(x=>x.someProperty) oder ändern Sie das Kapital M zu einem Kleinbuchstaben m in diesen Helfern.

+0

wenn ich verwendet '@Model. AuditDate.Value.ToString ("d") ' ' Weitere Informationen: Vorlagen können nur mit verwendet werden Feldzugriff, Eigenschaftenzugriff, eindimensionaler Array-Index oder benutzerdefinierte Ausdrücke für einen einzelnen Parameter. –

+0

@AbuHamzah - klingt, als ob Sie immer noch versuchen, dies in den Helfer 'Html.DisplayFor' zu bringen. Tu das nicht. Sind Sie auch sicher, dass es den Fehler auf dieser Zeile und nicht eine andere Eigenschaft, die Sie versuchen, den 'DisplayFor' Helfer zu verwenden, auf? – Tommy

+0

Wenn ich '@Model ...' habe, bekomme ich diesen Fehler: 'Model' Konflikte mit der Deklaration System.Web.Mvc.WebViewPage .Model ' –

0

Vielleicht versuchen einfach

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

auch können Sie viele Arten von String-Format wie .ToString ("dd MMM, yyyy") .ToString ("d") usw.

+0

Erhalte den Fehler: 'Model' kollidiert mit der Deklaration 'System.Web.Mvc.WebViewPage .Model ' –

+0

Wenn ich '@Modell' verwendet, erkennt es nicht –

+0

@AbuHamzah - Ich war falsch, es ist ein Großbuchstabe' M' bei der Verwendung in der HTML-Seite, Kleinbuchstaben 'm' bei der Deklaration. – Tommy

91

Wenn Sie Verwenden Sie DisplayFor, dann müssen Sie entweder das Format über das Attribut DisplayFormat definieren oder eine benutzerdefinierte Anzeigevorlage verwenden. (Eine vollständige Liste der voreingestellten DisplayFormatString 's here zu finden sind.)

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

Oder erstellen Sie die Ansicht Views\Shared\DisplayTemplates\DateTime.cshtml:

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

, die für alle DateTime s gelten, aber auch solche, wo man' Auch die Uhrzeit wird neu codiert.Wenn Sie wollen, dass es bisher nur geschützten Eigenschaften anzuwenden, dann Views\Shared\DisplayTemplates\Date.cshtml verwenden und das DataType Attribut auf Ihrem Grundstück:

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

Die letzte Option ist nicht DisplayFor zu verwenden und stattdessen die Eigenschaft macht direkt:

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

Ich habe ein displayTemplate als Sie erstellt vorgeschlagen und wenn ich den Code kopieren und einfügen, die Sie in der Vorlage haben, dann bekomme ich diesen Fehler 'Keine Überladung für die Methode 'ToString' dauert 1 Argumente' –

+0

Ich denke, dass sollte sein' [DisplayFormat (DataFormatString = "{0: MM/dd/yyyy} ")]' –

+0

@ StephenMuecke: Richtig. Die Antwort wurde aktualisiert. –

-1

Siehe this answer über die No overload for method 'ToString' takes 1 arguments Fehler.

Sie können kein Nullable DateTime formatieren - Sie müssen die DateTime.Value-Eigenschaft verwenden.

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

Tip: It is always helpful to work this stuff out in a standard class with intellisense before putting it into a view. In this case, you would get a compile error which would be easy to spot in a class.

+0

Wenn ich den vorgeschlagenen Code dann diesen Fehler "Model" Konflikt mit der Deklaration "System.Web.Mvc.WebViewPage .Model" –

1

implementiert ich die ähnliche Sache so:

  1. Verwenden TextBoxFor Datum im gewünschten Format angezeigt werden und das Feld Nur-Lese- zu machen.
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true}) 

2. Geben Sie Null Umriss und Null Grenze zu TextBox in css.

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

Und ...... Sein getan :)

+1

Aber warum würden Sie es so tun? – CodeCaster

+0

Weil eine der anderen Methoden für mich nicht funktioniert hat und es mir eine Menge Code erspart hat. Außerdem ist das Endergebnis schreibgeschützt und hat keinen Rand, so dass es nicht wie eine Textbox aussah. –

+0

Das funktioniert für mich ... +1 – imdadhusen

1

Für mich war es genug

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

Nach einigem Graben zu verwenden und ich landete Einstellung Thread ‚s CurrentCulture Wert haben CultureInfo("en-US") in der Aktionsmethode des Controllers:

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

Hier ar e einige other options, wenn Sie diese Einstellung in jeder Ansicht haben möchten.

über CurrentCulture Eigenschaftswert:

The CultureInfo object that is returned by this property, together with its associated objects, determine the default format for dates, times, numbers, currency values, the sorting order of text, casing conventions, and string comparisons.

Quelle: MSDN CurrentCulture

Hinweis: Die bisherige CurrentCulture Eigenschaftseinstellung ist wahrscheinlich optional, wenn der Controller bereits mit CultureInfo("en-US") oder ähnlichem ausgeführt wird, in dem das Datumsformat ist "MM/dd/yyyy".

Nach der CurrentCulture Eigenschaft festlegen, fügt Codeblock das Datum "M/d/yyyy" Format in der Ansicht zu konvertieren:

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

Oberhalb der @shortDateLocalFormat Variable mit ToString("M/d/yyyy") Werken formatiert ist. Wenn ToString("MM/dd/yyyy") verwendet wird, wie ich zuerst, dann haben Sie am Ende leading zero issue. Auch wie empfohlen von TommyToString("d") funktioniert auch. Eigentlich "d" steht für “Short date pattern” und kann auch mit anderen Kultur/Sprache-Formaten verwendet werden.

Ich denke, der Codeblock von oben kann auch mit etwas cool helper method oder ähnlichem ersetzt werden.

Zum Beispiel

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

    @shortDateLocalFormat 
} 

kann mit diesem Helfer Aufruf

@DateFormatter(Model.AuditDate) 

aktualisiert verwendet wird, fand ich heraus, dass es alternativer Weg, um die gleiche Sache zu tun, wenn DateTime.ToString(String, IFormatProvider) Methode verwendet wird. Wenn diese Methode verwendet wird, muss die ThreadCurrentCulture Eigenschaft nicht verwendet werden. Die wird als zweites Argument ->IFormatProvider zu DateTime.ToString(String, IFormatProvider) Methode übergeben.

Modified Hilfsmethode:

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

    @shortDateLocalFormat 
} 

.NET Fiddle

0

hatte ich ein ähnliches Problem auf meinem Controller und hier ist das, was für mich gearbeitet:

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

"DateSigned" ist der Wert von mein Modell Die Zeile liest, wenn der Modellwert einen Wert hat, formatieren Sie den Wert, ansonsten nichts anzeigen.

Hoffnung, die

1

hilft Ich habe in meinem Code diese Änderung wurde mit:

alten Code:

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

neu:

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

... und? Ist das eine Antwort oder was? –

+0

Ja, es ist einfach eine Lösung für das Problem von Thema. Ich dachte, das könnte für jemanden hilfreich sein. –

+0

OK, ich würde vorschlagen, dass Sie "Ich habe diese Änderung in meinem Code verwendet" zu etwas geändert haben, das ausdrücklich besagt, dass dies eine Lösung ist. –

Verwandte Themen