¿Cómo renderizar un DateTime en un formato específico en ASP.NET MVC 3?

Si tengo en mi clase de modelo una propiedad de tipo DateTime ¿cómo puedo representarla en un formato específico, por ejemplo, en el formato que ToLongDateString() ?

He intentado esto …

 @Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString()) 

… que lanza una excepción porque la expresión debe apuntar a una propiedad o campo. Y esto…

 @{var val = item.MyDateTime.ToLongDateString(); Html.DisplayFor(modelItem => val); } 

… que no lanza una excepción, pero la salida renderizada está vacía (aunque val contiene el valor esperado, como pude ver en el depurador).

Gracias por los consejos de antemano!

Editar

ToLongDateString es solo un ejemplo. Lo que realmente quiero usar en lugar de ToLongDateString es un método de extensión personalizado de DateTime y 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 ""; } 

Por lo tanto, creo que no puedo usar el atributo DisplayFormat y el parámetro DataFormatString en las propiedades de ViewModel.

Si todo lo que quiere hacer es mostrar la fecha con un formato específico, simplemente llame a:

 @String.Format(myFormat, Model.MyDateTime) 

Usar @Html.DisplayFor(...) es solo un trabajo extra a menos que especifique una plantilla, o necesite usar algo que esté basado en plantillas, como iterar un IEnumerable . Crear una plantilla es lo suficientemente simple y puede proporcionar mucha flexibilidad también. Cree una carpeta en su carpeta de vistas para el controlador actual (o la carpeta de vistas compartidas) llamada DisplayTemplates . Dentro de esa carpeta, agregue una vista parcial con el tipo de modelo para el que desea construir la plantilla. En este caso agregué /Views/Shared/DisplayTemplates y agregué una vista parcial llamada ShortDateTime.cshtml .

 @model System.DateTime @Model.ToShortDateString() 

Y ahora puedes llamar a esa plantilla con la siguiente línea:

 @Html.DisplayFor(m => m.MyDateTime, "ShortDateTime") 

Puede decorar su propiedad de modelo de vista con el atributo [DisplayFormat] :

 [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime MyDateTime { get; set; } 

y en su opinión:

 @Html.EditorFor(x => x.MyDate) 

o, para mostrar el valor,

 @Html.DisplayFor(x => x.MyDate) 

Otra posibilidad, que no recomiendo, es usar un ayudante débilmente tipado:

 @Html.TextBox("MyDate", Model.MyDate.ToLongDateString()) 

Salida formateada simple dentro del modelo

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

o en el bucle foreach

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

Utilizo el siguiente acercamiento al formato en línea y visualizo una propiedad de fecha del modelo.

 @Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}") 

De lo contrario, al rellenar un TextBox o Editor, podría hacer lo mismo que sugirió @Darin, decoró el atributo con un atributo [DisplayFormat] .

Si todos sus tipos de DateTime se procesan de la misma manera, puede usar una plantilla de visualización personalizada de DateTime .

En la carpeta Vistas, cree una carpeta llamada “Plantillas de pantalla” en la carpeta de vistas específicas del controlador o en la carpeta “Compartido” (estas funciones son similares a las de los parciales).

En el interior, cree un archivo llamado DateTime.cshtml que tome DateTime como el @model y codifique cómo desea representar su fecha:

 @model System.DateTime @Model.ToLongDateString() 

Ahora puedes usar esto en tus vistas y debería funcionar:

 @Html.DisplayFor(mod => mod.MyDateTime) 

Siempre que siga la convención de agregarlo a la carpeta “DisplayTemplates” y nombrar el archivo para que coincida con el tipo que está mostrando, MVC lo usará automáticamente para mostrar sus valores. Esto también funciona para editar escenarios usando “EditorTemplates”.

Aquí hay más información sobre plantillas .

Mi preferencia es mantener los detalles de formato con la vista y no con el modelo de vista. Entonces en MVC4 / Razor:

 @Html.TextBoxFor(model => model.DateTime, "{0:d}"); 

referencia de formato de fecha y hora: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

Entonces tengo un jQuery datepicker vinculado a él, y esa es la fecha en un formato diferente … ¡doh!

Parece que necesito establecer el formato del datepicker con el mismo formato.

Así que estoy almacenando el formato System.Globalization en un atributo data- * y recopilándolo al configurar el

 @Html.TextBoxFor( model => model.DateTime.Date, "{0:d}", new { @class = "datePicker", @data_date_format=System.Globalization.CultureInfo .CurrentUICulture.DateTimeFormat.ShortDatePattern })); 

Y esta es la parte sucky: los formatos de .net y datepicker no coinciden, por lo que se necesita hackeo:

 $('.datePicker').each(function(){ $(this).datepicker({ dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy") }); }); 

eso es algo débil, pero debería cubrir muchos casos.

funciona para mi

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

Tuve el mismo problema recientemente.

Descubrí que simplemente definir DataType como fecha en el modelo también funciona (usando el enfoque Code First)

 [DataType(DataType.Date)] public DateTime Added { get; set; } 

puedes hacer esto como @item.Date.Value.Tostring("dd-MMM-yy");

si solo quiero mostrar la fecha en formato corto, simplemente uso @ Model.date.ToShortDateString () e imprime la fecha en

Si todo lo que quiere hacer es mostrar la fecha con un formato específico, simplemente llame a:

 @Model.LeadDate.ToString("dd-MMM-yyyy") @Model.LeadDate.ToString("MM/dd/yy") 

Dará como resultado el siguiente formato,

 26-Apr-2013 04/26/13 

esto se mostrará en formato dd/MM/yyyy en su vista

En vista:

en lugar de DisplayFor usar este código

  @(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")  

también comprueba si el valor es nulo en la columna de fecha, si es verdadero, mostrará la fecha está vacía o la fecha formateada real de la columna.

Hope ayuda a alguien

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

En MVC5 usaría, si su modelo es el horario

 string dt = Model.ToString("dd/MM/yyy"); 

O si su modelo contiene la propiedad de la fecha y hora

 string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

Este es el significado oficial de los Formatos:

https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx

Solo Ver archivo Ajuste así. Puedes intentar esto.

 @Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), "{0: yyyy-MM-dd}") 

item.transdate es su tipo de datos DateTime .