Форматирование поля TimeSpan модели MVC

У меня есть страница MVC, содержащая несколько timepickers. Они сохраняются в списке объектов в модели как nullable TimeSpan. Проблема в том, что я получаю временные интервалы, напечатанные с секундами, в поля ввода. Есть ли способ отформатировать эти свойства модели, чтобы получить временные рамки, напечатанные каким-либо другим способом (например, 7:00 вместо 07:00:00)? Излишне говорить, что мое "предложение" [DisplayFormat...] не срабатывало. По крайней мере, не так, как я надеялся.

Поля ввода определяются следующим образом:

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

Соответствующая часть модели выглядит следующим образом:

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

    ...
}

Цените это, как всегда!

Ответы

Ответ 1

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

Но имейте в виду, что основной целью TimeSpan является представление измеренной продолжительности времени, а не времени суток. Это означает, что значения TimeSpan могут быть больше 24 часов. Они также могут быть отрицательными, чтобы представлять перемещение назад на временной шкале.

Допустимо использовать их как время суток и фактически выполняется самой картой (например, DateTime.TimeOfDay). Но при использовании этого способа вы должны тщательно проверять ввод пользователя. Если вы просто полагаетесь на тип данных, пользователь может ввести значения, которые являются действительными временными интервалами, но не действительными днями. Например, -1.22:33:44 является допустимым TimeSpan, который представляет собой 1 день, 22 часа, 33 минуты и 44 секунды в прошлом.

Было бы намного проще, если бы .Net имел собственный тип Time, , но он не. Обновление. В пакете System.Time теперь есть собственный TimeOfDay тип, доступный в CoreFXLab.

Кроме того, метод TextBoxFor не будет собирать аннотацию данных. Вы можете прямо указать строку формата в качестве параметра, например:

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

Или вы можете переключиться на EditorFor следующим образом:

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