net mvc form example dataannotations data asp annotation asp.net-mvc format timespan

asp.net mvc - mvc - Formato del campo MVS modelo TimeSpan



mvc validation (1)

Tengo una página MVC que contiene algunos timepickers. Estos se almacenan en una lista de objetos en el modelo como TimeSpan valores TimeSpan . El problema es que hago que los intervalos de tiempo se impriman con segundos en los campos de entrada. ¿Hay alguna forma de dar formato a estas propiedades del modelo para que pueda imprimir los intervalos de tiempo de alguna otra manera (como las 7:00 , en lugar de las 07:00:00 )? No hace falta decir que mi "sugerencia" de [DisplayFormat...] no funcionó. Al menos no como yo esperaba.

Los campos de entrada se definen así:

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

La parte relevante del modelo se ve así:

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

Lo aprecio como siempre!


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

Pero tenga en cuenta que el propósito principal de TimeSpan es representar una duración de tiempo medida, no una hora del día. Esto significa que los valores de TimeSpan pueden TimeSpan más de 24 horas. También pueden ser negativos, para representar retroceder en la línea de tiempo.

Es aceptable usarlos como hora del día, y en realidad lo hace el propio marco (por ejemplo, DateTime.TimeOfDay ). Pero cuando se usa de esta manera, debe validar la entrada del usuario con cuidado. Si solo confía en el tipo de datos, el usuario podría ingresar valores que son intervalos de tiempo válidos, pero no días válidos. Por ejemplo, -1.22:33:44 es un TimeSpan válido que representa 1 día, 22 horas, 33 minutos y 44 segundos en el pasado .

Sería mucho más fácil si .Net tuviera un tipo de Time nativo, pero no es así . Actualización : ahora hay un tipo nativo de TimeOfDay en el paquete System.Time disponible en CoreFXLab .

Además, el método TextBoxFor no recogerá la anotación de datos. Puede especificar directamente la cadena de formato como un parámetro, como este:

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

O puede cambiar a EditorFor así:

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