it-swarm.com.de

Wie Rendern einer DateTime in einem bestimmten Format in ASP.NET MVC 3?

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.

115
Slauma

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")
158
Nick Larsen

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())
170
Darin Dimitrov

Einfache formatierte Ausgabe innerhalb des Modells 

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

oder in der foreach-Schleife

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

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.

23
Steven

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".

Hier sind einige weitere Informationen zu Vorlagen .

9
ataddeini

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.

7
philn5d

funktioniert bei mir 

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

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; }
2

sie können dies tun @item.Date.Value.Tostring("dd-MMM-yy");

1
Saurabh Solanki

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
0
Kailas Mane

wenn ich nur das Datum im Kurzformat anzeigen möchte, verwende ich einfach @ Model.date.ToShortDateString () und es gibt das Datum in aus 

0
Marcianin

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

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

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.

0
stom