Wenn ich in meiner Modellklasse eine Eigenschaft vom Typ DateTime
habe, wie kann ich sie dann in einem bestimmten Format darstellen - beispielsweise in dem Format, das ToLongDateString()
zurückgibt?
Ich habe das versucht ...
@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
... was eine Ausnahme auslöst, weil der Ausdruck auf eine Eigenschaft oder ein Feld zeigen muss. Und das...
@{var val = item.MyDateTime.ToLongDateString();
Html.DisplayFor(modelItem => val);
}
... was keine Ausnahme auslöst, aber die gerenderte Ausgabe ist leer (obwohl val
den erwarteten Wert enthält, wie ich im Debugger sehen konnte).
Danke für tipps im voraus!
Bearbeiten
ToLongDateString
ist nur ein Beispiel. Was ich eigentlich anstelle von ToLongDateString
verwenden möchte, ist eine benutzerdefinierte Erweiterungsmethode von DateTime
und 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 "";
}
Ich denke, ich kann das DisplayFormat
-Attribut und den DataFormatString
-Parameter nicht für die ViewModel-Eigenschaften verwenden.
Wenn Sie nur das Datum in einem bestimmten Format anzeigen möchten, rufen Sie einfach an:
@String.Format(myFormat, Model.MyDateTime)
Die Verwendung von @Html.DisplayFor(...)
ist nur eine zusätzliche Arbeit, es sei denn, Sie geben eine Vorlage an oder müssen etwas verwenden, das auf Vorlagen basiert, z. B. das Durchlaufen eines IEnumerable<T>
. Das Erstellen einer Vorlage ist einfach genug und bietet auch viel Flexibilität. Erstellen Sie in Ihrem Ansichtenordner einen Ordner für den aktuellen Controller (oder den Ordner für freigegebene Ansichten) mit dem Namen DisplayTemplates
. Fügen Sie in diesem Ordner eine Teilansicht mit dem Modelltyp hinzu, für den Sie die Vorlage erstellen möchten. In diesem Fall habe ich /Views/Shared/DisplayTemplates
hinzugefügt und eine Teilansicht mit dem Namen ShortDateTime.cshtml
hinzugefügt.
@model System.DateTime
@Model.ToShortDateString()
Und jetzt können Sie diese Vorlage mit der folgenden Zeile aufrufen:
@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
Sie können Ihre Ansichtsmodelleigenschaft mit dem Attribut [DisplayFormat]
dekorieren:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }
und aus deiner Sicht:
@Html.EditorFor(x => x.MyDate)
oder zur Anzeige des Wertes
@Html.DisplayFor(x => x.MyDate)
Eine andere Möglichkeit, die ich nicht empfehlen kann, besteht darin, einen schwach typisierten Helfer zu verwenden:
@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
Einfache formatierte Ausgabe innerhalb des Modells
@String.Format("{0:d}", model.CreatedOn)
oder in der foreach-Schleife
@String.Format("{0:d}", item.CreatedOn)
Ich verwende den folgenden Ansatz zum Inline-Format und zur Anzeige einer Datumseigenschaft aus dem Modell.
@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
Andernfalls könnten Sie, wenn Sie ein TextBox oder einen Editor füllen, wie von @Darin vorgeschlagen, das Attribut mit einem [DisplayFormat]
-Attribut versehen.
Wenn alle Ihre DateTime
-Typen auf dieselbe Weise gerendert werden, können Sie eine benutzerdefinierte DateTime
-Anzeigevorlage verwenden.
Erstellen Sie in Ihrem Ordner "Views" einen Ordner mit dem Namen "DisplayTemplates", entweder unter Ihrem Controller-spezifischen Ordner "Views" oder im Ordner "Shared" (diese funktionieren ähnlich wie Teilbilder).
Erstellen Sie im Inneren eine Datei mit dem Namen DateTime.cshtml
, die DateTime
als @model
verwendet, und geben Sie an, wie Sie Ihr Datum rendern möchten:
@model System.DateTime
@Model.ToLongDateString()
Jetzt können Sie dies einfach in Ihren Ansichten verwenden und es sollte funktionieren:
@Html.DisplayFor(mod => mod.MyDateTime)
Solange Sie sich an die Konvention halten, sie zum Ordner "DisplayTemplates" hinzuzufügen und die Datei entsprechend dem angezeigten Typ zu benennen, verwendet MVC diese automatisch zur Anzeige Ihrer Werte. Dies funktioniert auch für die Bearbeitung von Szenarien mit "EditorTemplates".
Meine Präferenz ist, die Formatierungsdetails mit der Ansicht und nicht mit dem Ansichtsmodell beizubehalten. Also in MVC4/Rasierer:
@Html.TextBoxFor(model => model.DateTime, "{0:d}");
datum/Uhrzeit-Formatreferenz: http://msdn.Microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx
Dann habe ich einen JQuery Datepicker daran gebunden, und das Datum ist in einem anderen Format ... doh!
Sieht aus, als müsste ich das Datepicker-Format auf dieselbe Formatierung einstellen.
Also speichere ich die System.Globalization
-Formatierung in einem data- * -Attribut und sammle es beim Einrichten des
@Html.TextBoxFor(
model => model.DateTime.Date,
"{0:d}",
new
{
@class = "datePicker",
@data_date_format=System.Globalization.CultureInfo
.CurrentUICulture.DateTimeFormat.ShortDatePattern
}));
Und hier ist der verdammte Teil: Die Formate von .net und datepicker stimmen nicht überein, daher ist Hacker nötig:
$('.datePicker').each(function(){
$(this).datepicker({
dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
});
});
das ist ziemlich schwach, sollte aber viele Fälle abdecken.
funktioniert bei mir
<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
Hatte vor kurzem das gleiche Problem.
Ich entdeckte, dass das einfache Definieren von DataType as Date im Modell ebenfalls funktioniert (unter Verwendung von Code First).
[DataType(DataType.Date)]
public DateTime Added { get; set; }
sie können dies tun @item.Date.Value.Tostring("dd-MMM-yy");
Wenn Sie nur das Datum in einem bestimmten Format anzeigen möchten, rufen Sie einfach an:
@Model.LeadDate.ToString("dd-MMM-yyyy")
@Model.LeadDate.ToString("MM/dd/yy")
Es ergibt sich folgendes Format,
26-Apr-2013
04/26/13
wenn ich nur das Datum im Kurzformat anzeigen möchte, verwende ich einfach @ Model.date.ToShortDateString () und es gibt das Datum in aus
In MVC5 würde ich verwenden, wenn dein Modell die Datumszeit ist
string dt = Model.ToString("dd/MM/yyy");
Oder wenn Ihr Modell die Eigenschaft von datetime enthält
string dt = Model.dateinModel.ToString("dd/MM/yyy");
Hier ist die offizielle Bedeutung der Formate:
https://msdn.Microsoft.com/de-de/library/8kb3ddd4(v=vs.110).aspx
@{
string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");
@datein
}
dies wird in Ihrer Ansicht im dd/MM/yyyy
-Format angezeigt
Im Hinblick auf:
verwenden Sie statt DisplayFor
diesen Code
<td>
@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")
</td
er prüft auch, ob der Wert in der Datumsspalte Null ist. Wenn "Wahr" angezeigt wird, wird "Datum ist leer" oder das tatsächliche formatierte Datum aus der Spalte angezeigt.
Hoffnung hilft jemandem.