2013-07-10 13 views
16

Ich habe eine MVC-Seite mit ein paar Zeitzählern. Diese werden in einer Liste von Objekten im Modell als Nullable TimeSpan gespeichert. Das Problem ist, dass ich die Timespans mit Sekunden in die Eingabefelder geschrieben habe. Gibt es eine Möglichkeit, diese Modelleigenschaften zu formatieren, so dass die Zeitspannen auf andere Weise gedruckt werden (wie 7:00 statt 07:00:00)? Unnötig zu sagen, mein "Vorschlag" von hat nicht funktioniert. Zumindest nicht so, wie ich es mir erhofft hatte.Formatieren des MVC-Modells TimeSpan-Feld

Die Eingabefelder sind wie folgt definiert:

@Html.TextBoxFor(x => x.Shifts[i].Start) 

Der relevante Teil des Modells wie folgt aussieht:

public class Workshift 
{ 
    [DisplayFormat(Something here perhaps?)] 
    public TimeSpan? Start { get; set; } 
    public TimeSpan? End { get; set; } 
    public TimeSpan? Pause { get; set; } 
} 

public class TimeRegistrationViewModel 
{ 
    public List<Workshift> Shifts { get; set; } 

    ... 
} 

es wie immer schätzen!

+0

Da niemand scheint zu wissen, wie dies zu erreichen, ging ich mit Strings anstelle von TimeSpans verwenden Wäre immer noch cool zu wissen, wie man es richtig macht. – SamiHuutoniemi

Antwort

25
[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)] 
public TimeSpan? Start { get; set; } 

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)] 
public TimeSpan? End { get; set; } 

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)] 
public TimeSpan? Pause { get; set; } 

Aber denken Sie daran, dass der Hauptzweck für TimeSpan ist eine gemessene Dauer der Zeit darzustellen, keine Tageszeit. Dies bedeutet, dass TimeSpan Werte länger als 24 Stunden sein können. Sie können auch negativ sein, um rückwärts auf der Timeline zu stehen.

Es ist akzeptabel, um sie als Tageszeit zu verwenden, und wird tatsächlich durch das Framework selbst durchgeführt (z. B. DateTime.TimeOfDay). Aber wenn Sie auf diese Weise verwendet werden, sollten Sie die Benutzereingaben sorgfältig überprüfen. Wenn Sie sich nur auf den Datentyp verlassen, kann der Benutzer möglicherweise Werte eingeben, die gültige Zeitspannen, aber keine gültigen Tageszeiten sind. Zum Beispiel ist -1.22:33:44 eine gültige TimeSpan, die 1 Tag, 22 Stunden, 33 Minuten und 44 Sekunden in der Vergangenheit darstellt.

Es wäre so viel einfacher, wenn. Net einen nativen Time Typ hätte, , aber es nicht. Update: Es gibt jetzt einen nativen TimeOfDay Typ im System.Time Paket in CoreFXLab.

Auch die Methode wird nicht die Datenannotation abholen. Sie können entweder direkt mit dem Format-String als Parameter angeben, wie folgt aus:

@Html.TextBoxFor(x => x.Shifts[i].Start, "{0:hh\\:mm}") 

Oder Sie können auf EditorFor wie folgt wechseln:

@Html.EditorFor(x => x.Shifts[i].Start) 
+0

Diese Antwort war sehr nützlich für mich. Ich danke dir sehr! –

+0

Es ist sehr nützlich beim Erwähnen von: "Auch die TextBoxFor Methode wird nicht die Daten Annotation abholen." Haben Sie eine Referenz zu dieser Linie? – nguyenhoai890

Verwandte Themen