@ Html.DisplayFor - DateFormat ("MM / TT / JJJJ")

85

Ich habe den folgenden Rasiermessercode, für den ich ein mm/dd/yyyyDatumsformat haben möchte :

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

Ich habe verschiedene Ansätze ausprobiert, aber keiner dieser Ansätze funktioniert in meiner Situation

Mein AuditDate ist ein DateTime?Typ

Ich habe so etwas versucht und diesen Fehler erhalten:

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

Zusätzliche Informationen: Vorlagen können nur mit Feldzugriff, Eigenschaftszugriff, eindimensionalem Array-Index oder benutzerdefinierten Indexerausdrücken mit einzelnen Parametern verwendet werden.

Versuchte dies:

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

Keine Überladung für die Methode 'ToString' erfordert 1 Argumente

Nick Kahn
quelle

Antworten:

149

Wenn Sie verwenden DisplayFor, müssen Sie entweder das Format über das DisplayFormatAttribut definieren oder eine benutzerdefinierte Anzeigevorlage verwenden. (Eine vollständige Liste der Voreinstellungen DisplayFormatStringfinden Sie hier .)

[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")
}

Dies gilt jedoch für alle DateTimes, auch für diejenigen, bei denen Sie die Zeit ebenfalls codieren. Wenn Sie möchten, dass es nur für Nur-Datum-Eigenschaften gilt, verwenden Sie Views\Shared\DisplayTemplates\Date.cshtmlund das DataTypeAttribut für Ihre Eigenschaft:

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

Die letzte Option besteht darin DisplayFor, die Eigenschaft nicht direkt zu verwenden und stattdessen zu rendern:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Chris Pratt
quelle
Ich habe eine displayTemplate erstellt, wie Sie vorgeschlagen haben, und wenn ich den Code, den Sie in der Vorlage haben, kopiere und einfüge, erhalte ich diesen FehlerNo overload for method 'ToString' takes 1 arguments
Nick Kahn
3
Ich denke das sollte sein[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: TT / MM / JJJJ}")] arbeitete für die Türkei danke
Zapoo
@ Mac: Wie meinst du das? Sie sind sehr viel tun Arbeit, aber vielleicht einfach nicht in Ihrem speziellen Szenario. Ohne weitere Informationen kann ich nicht sagen, wie Ihre Situation ist.
Chris Pratt
Wenn der Editor auch das Format verwenden soll, fügen Sie ApplyFormatInEditMode = trueder Eigenschaft Folgendes hinzu : [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Es sollte offensichtlich sein, aber wenn Sie alle keine Zeit mehr haben, das Kopieren und Einfügen zu verschwenden, könnte dieser Hinweis von Intellisense wie bei mir über Ihre Nase gehen :)
Heki
19

Wenn Sie einfach den Wert dieser Modelleigenschaft ausgeben, benötigen Sie den DisplayForHTML-Helfer nicht. Rufen Sie ihn einfach direkt mit der richtigen Zeichenfolgenformatierung auf .

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

Sollte ausgeben

Audit Date: 1/21/2015

Schließlich kann Ihr Überwachungsdatum null sein. Sie sollten daher die bedingte Prüfung durchführen, bevor Sie versuchen, einen nullbaren Wert zu formatieren.

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

Wenn Sie den Fehler googeln, den Sie erhalten, erhalten Sie diese Antwort. Dies zeigt, dass der Fehler auf die Verwendung des Wortes Modell in Ihren HTML-Helfern zurückzuführen ist. Zum Beispiel mit @Html.DisplayFor(Model=>Model.someProperty). Ändern Sie diese, um etwas anderes als Modelbeispielsweise zu verwenden, @Html.DisplayFor(x=>x.someProperty)oder ändern Sie das Kapital in diesen Helfern in MKleinbuchstaben m.

Tommy
quelle
wenn ich verwendet habe @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 - hört sich so an, als würden Sie immer noch versuchen, dies in den Html.DisplayForHelfer zu stellen. Tu das nicht. Sind Sie auch sicher, dass der Fehler in diese Zeile und nicht in eine andere Eigenschaft geworfen wird, für die Sie den DisplayForHelfer verwenden möchten?
Tommy
Wenn ich verwendet @Model...habe, erhalte ich folgende Fehlermeldung: 'Model' widerspricht der Deklaration System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn
@AbuHamzah Bitte beachten Sie den letzten Absatz in meiner aktualisierten Antwort.
Tommy
10

Ich habe diese Änderung in meinem Code verwendet:

alter Code:

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

Neu :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Piotr Mirek
quelle
... und? Ist das eine Antwort oder was?
Maciej Jureczko
Ja, es ist einfach eine Lösung für ein Problem vom Thema. Ich dachte, das könnte jemandem helfen.
Piotr Mirek
OK, ich würde vorschlagen, dass Sie "Ich habe diese Änderung in meinem Code verwendet" in etwas ändern, das ausdrücklich besagt, dass dies eine Lösung ist.
Maciej Jureczko
Einfache und bequeme Antwort, hat bei mir funktioniert danke !!
Scanner
5

Die Antwort von @ ChrisPratt zur Verwendung der Anzeigevorlage ist falsch. Der richtige Code, damit es funktioniert, ist:

@model DateTime?

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

Das liegt daran, dass .ToString()for Nullable<DateTime>keine FormatParameter akzeptiert .

Leonel Sanches da Silva
quelle
5

Ich habe das Gleiche folgendermaßen implementiert:

  1. Verwenden Sie TextBoxFor , um das Datum im erforderlichen Format anzuzeigen und das Feld schreibgeschützt zu machen .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Geben Sie TextBox in CSS einen Umriss von Null und einen Rand von Null.

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

Und ...... es ist geschafft :)

Akshat
quelle
1
Aber warum würdest du das so machen?
CodeCaster
Weil eine der anderen Methoden bei mir nicht funktioniert hat und mir viel Codierung erspart hat. Außerdem ist das Endergebnis schreibgeschützt und hat keinen Rand, sodass es nicht wie ein Textfeld aussah.
Akshat
4

Für mich war es genug zu benutzen

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

Sie können das Attribut [ DisplayFormat ] in Ihrem Ansichtsmodell verwenden, um dieses Format für das gesamte Projekt anzuwenden.

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

Nach einigem Graben und ich landete Einstellung Thread‚s Current Wert haben Culture (‚en-US‘) in der Steuerung Aktionsmethode:

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

Hier sind einige andere Optionen, wenn Sie diese Einstellung für jede Ansicht festlegen möchten.

Informationen zum CurrentCultureImmobilienwert:

Das CultureInfo- Objekt, das von dieser Eigenschaft zurückgegeben wird, bestimmt zusammen mit den zugehörigen Objekten das Standardformat für Datum, Uhrzeit , Zahlen, Währungswerte, Sortierreihenfolge von Text, Groß- und Kleinschreibung und Zeichenfolgenvergleiche.

Quelle: MSDN CurrentCulture

Hinweis: Die vorherige CurrentCultureEigenschafteneinstellung ist wahrscheinlich optional, wenn der Controller bereits mit CultureInfo("en-US")oder ähnlich ausgeführt wird, wenn das Datumsformat vorliegt "MM/dd/yyyy".

Fügen Sie nach dem Festlegen der CurrentCultureEigenschaft einen Codeblock hinzu, um das Datum in das "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

Oben ist die @shortDateLocalFormatVariable mit ToString("M/d/yyyy")Werken formatiert . Wenn ToString("MM/dd/yyyy")es verwendet wird, wie ich es zuerst getan habe, haben Sie am Ende das führende Null-Problem . Auch wie von Tommy empfohlen ToString("d")funktioniert auch. "d"Steht eigentlich für "Short Date Pattern" und kann auch mit verschiedenen Kultur- / Sprachformaten verwendet werden.

Ich denke, der Codeblock von oben kann auch durch eine coole Hilfsmethode oder ähnliches ersetzt werden.

Beispielsweise

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

    @shortDateLocalFormat
}

kann mit diesem Hilfsaufruf verwendet werden

@DateFormatter(Model.AuditDate)

Update , ich habe herausgefunden, dass es eine alternative Möglichkeit gibt, dasselbe zu tun, wenn die DateTime.ToString- Methode (String, IFormatProvider) verwendet wird. Wenn dieses Verfahren verwendet wird , dann gibt es keinen Grund zur Verwendung Thread‚s - CurrentCultureEigenschaft. Das CultureInfo("en-US")wird als zweites Argument -> IFormatProvider an die DateTime.ToString(String, IFormatProvider)Methode übergeben.

Modifizierte Hilfsmethode:

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

    @shortDateLocalFormat
}

.NET Geige

Jyrkim
quelle
1

Vielleicht einfach versuchen

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

Sie können auch viele Arten von Zeichenfolgenformaten wie .ToString ("TT MMM, JJJJ") .ToString ("TT") usw. verwenden

Wiizl
quelle
Fehlermeldung: 'Model' widerspricht der Deklaration 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn
wenn ich @modeles benutzt habe erkennt es nicht
Nick Kahn
@AbuHamzah - Ich habe mich geirrt, es ist ein Kapital Mbei der Verwendung in der HTML-Seite, Kleinbuchstaben bei der mDeklaration.
Tommy
Immer noch den Fehler erhalten, siehe ich antworte auf Tommys Antwort
Nick Kahn
1
No overload for method 'ToString' takes 1 argumentsbeschwere mich, wenn ich benutzeToString("mm/dd/yyyy")
Nick Kahn
1

In der Ansicht Ersetzen Sie dies:

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

Mit:

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

Erläuterung: Wenn der AuditDate-Wert nicht null ist, wird das Datum in TT / MM / JJJJ formatiert. Andernfalls lassen Sie es unverändert, da es keinen Wert hat.

user2298633
quelle
0

Ich hatte ein ähnliches Problem mit meinem Controller und hier ist, was für mich funktioniert hat:

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

"DateSigned" ist der Wert aus meinem Modell. Die Zeile lautet: Wenn der Modellwert einen Wert hat, formatieren Sie den Wert, andernfalls wird nichts angezeigt.

hoffentlich hilft das

user3170254
quelle
0

Dies ist der beste Weg, um eine einfache Datumszeichenfolge zu erhalten:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ahmad fatemh
quelle
Diese Antwort bewirkt Folgendes: Nimmt die HtmlStringAusgabe von DisplayFor, konvertiert sie in a String, analysiert sie als a DateTimeund formatiert sie dann als a String. Meiner Meinung nach unnötig komplex.
Heretic Monkey
0

Sie könnten Konvertieren verwenden

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

Siehe diese Antwort zum No overload for method 'ToString' takes 1 argumentsFehler.

Sie können eine nullfähige DateTime nicht formatieren - Sie müssen die DateTime.Value-Eigenschaft verwenden.

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

Tipp: Es ist immer hilfreich, dieses Material in einer Standardklasse mit Intellisense zu erarbeiten, bevor Sie es in eine Ansicht einfügen. In diesem Fall würden Sie einen Kompilierungsfehler erhalten, der in einer Klasse leicht zu erkennen wäre.

NightOwl888
quelle
Wenn ich den vorgeschlagenen Code verwende, wird dieser Fehler angezeigt'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn