2013-07-10 12 views
16

Mam stronę MVC zawierającą kilka datepickerów. Są one przechowywane na liście obiektów w modelu jako zerowalne TimeSpan. Problem polega na tym, że czasy są drukowane z sekundami w polach wejściowych. Czy jest jakiś sposób na sformatowanie tych właściwości modelu, aby uzyskać wydruk w inny sposób (np. 7:00, zamiast 07:00:00)? Nie trzeba dodawać, że moja "sugestia" z [DisplayFormat...] nie działa. Przynajmniej nie tak, jak się spodziewałem.Formatowanie pola TimeSpan modelu MVC

Pola wejściowe są zdefiniowane następująco:

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

Istotna część modelu wygląda następująco:

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

    ... 
} 

Doceń go, jak zawsze!

+0

Ponieważ nikt nie wie, jak to osiągnąć, poszedłem z za pomocą łańcuchów zamiast TimeSpans. Nadal byłoby fajnie wiedzieć, jak to zrobić właściwie. – SamiHuutoniemi

Odpowiedz

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

Ale należy pamiętać, że głównym celem dla TimeSpan jest reprezentowanie odmierzoną długość czasu, a nie godzinę. Oznacza to, że wartości TimeSpan mogą być dłuższe niż 24 godziny. Mogą również być ujemne, aby reprezentować ruch wstecz na osi czasu.

Jest to akceptowalny do używania ich jako pory dnia i jest faktycznie wykonywany przez samą strukturę (na przykład DateTime.TimeOfDay). Ale gdy jest używany w ten sposób, powinieneś starannie weryfikować dane wprowadzone przez użytkownika. Jeśli po prostu polegasz na typie danych, użytkownik może wprowadzić wartości, które są prawidłowymi przedziałami czasowymi, ale niepoprawnymi godzinami. Na przykład -1.22:33:44 jest prawidłowym TimeSpan, który reprezentuje 1 dzień, 22 godziny, 33 minuty i 44 sekundy w przeszłości.

Byłoby znacznie łatwiejsze, gdyby .Net miał natywny typ Time, , ale nie jest to. Aktualizacja: Istnieje teraz rodzimy typ TimeOfDay w pakiecie System.Time dostępny pod numerem CoreFXLab.

Ponadto, metoda TextBoxFor nie będzie pobierać adnotacji danych. można bezpośrednio określić ciąg formatu jako parametr w następujący sposób:

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

Albo można przełączyć się EditorFor tak:

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

Ta odpowiedź była dla mnie niezwykle przydatna. Dziękuję bardzo! –

+0

Jest to bardzo przydatne, gdy wspomina się o: "Ponadto, metoda TextBoxFor nie będzie pobierać adnotacji danych." Czy masz jakieś odniesienia na temat tej linii? – nguyenhoai890