@ Html.DisplayFor – DateFormat (“mm / dd / aaaa”)

Tengo el siguiente código de afeitado que quiero tener formato de fecha mm/dd/yyyy :

 Audit Date: @Html.DisplayFor(Model => Model.AuditDate) 

He intentado varios enfoques diferentes pero ninguno de esos enfoques funciona en mi situación

mi AuditDate es un DateTime? tipo

Intenté algo como esto y obtuve este error:

 @Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString()) 

Información adicional: las plantillas solo se pueden usar con acceso de campo, acceso a propiedades, índice de matriz de dimensión única o expresiones de indizador personalizadas de parámetro único.

Intenté esto:

 @Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy")) 

Sin sobrecarga para el método ‘ToString’ toma 1 argumentos

Si usa DisplayFor , entonces debe definir el formato a través del atributo DisplayFormat o usar una plantilla de visualización personalizada. ( DisplayFormatString se puede encontrar una lista completa de las DisplayFormatString de DisplayFormatString de DisplayFormatString preestablecidas).

 [DisplayFormat(DataFormatString = "{0:d}")] public DateTime? AuditDate { get; set; } 

O cree la vista Views\Shared\DisplayTemplates\DateTime.cshtml :

 @model DateTime? @if (Model.HasValue) { @Model.Value.ToString("MM/dd/yyyy") } 

Sin embargo, eso se aplicará a todos los DateTime , incluso aquellos en los que también está codificando la hora. Si desea que se aplique solo a las propiedades de solo fecha, use Views\Shared\DisplayTemplates\Date.cshtml y el atributo DataType en su propiedad:

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

La última opción es no usar DisplayFor y, en su lugar, renderizar la propiedad directamente:

 @if (Model.AuditDate.HasValue) { @Model.AuditDate.Value.ToString("MM/dd/yyyy") } 

Si simplemente está generando el valor de la propiedad de ese modelo, no necesita el DisplayFor html, simplemente DisplayFor directamente con el formato de cadena adecuado .

Audit Date: @Model.AuditDate.Value.ToString("d")

Debería producirse

Audit Date: 1/21/2015

Por último, su fecha de auditoría podría ser nula, por lo que debe hacer la verificación condicional antes de intentar formatear un valor que admite valores.

 @if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")} 

Buscar en Google el error que está obteniendo proporciona esta respuesta , que muestra que el error proviene del uso de la palabra Modelo en sus ayudantes Html. Por ejemplo, usando @Html.DisplayFor(Model=>Model.someProperty) . Cambie estos para usar algo que no sea el Model , por ejemplo: @Html.DisplayFor(x=>x.someProperty) o cambie la M mayúscula a una m en minúscula en estos helpers.

La respuesta de @ ChrisPratt sobre el uso de la plantilla de visualización es incorrecta. El código correcto para que funcione es:

 @model DateTime? @if (Model.HasValue) { @Convert.ToDateTime(Model).ToString("MM/dd/yyyy") } 

Eso es porque .ToString() para Nullable no acepta el parámetro Format .

Implementé lo similar de esta manera:

  1. Use TextBoxFor para mostrar la fecha en el formato requerido y haga que el campo sea de solo lectura .
 @Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true}) 

2. Dé contorno cero y borde cero a TextBox en css.

 .my-style { outline: none; border: none; } 

Y …… Está hecho 🙂

Después de cavar un poco y terminé configurando el valor CurrentCulture de Thread para tener CultureInfo (“en-US”) en el método de acción del controlador:

 Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

Aquí hay algunas otras opciones si desea tener esta configuración en cada vista.

Acerca del valor de propiedad de CurrentCulture :

El objeto CultureInfo devuelto por esta propiedad, junto con sus objetos asociados, determina el formato predeterminado para las fechas, horas, números, valores de moneda, el orden de clasificación del texto, las convenciones de envoltura y las comparaciones de cadenas.

Fuente: MSDN CurrentCulture

Nota: La configuración de la propiedad CurrentCulture anterior es probablemente opcional si el controlador ya se está ejecutando con CultureInfo("en-US") o similar, donde el formato de fecha es "MM/dd/yyyy" .

Después de configurar la propiedad CurrentCulture , agregue el bloque de código para convertir la fecha al formato "M/d/yyyy" en la vista:

 @{ //code block var shortDateLocalFormat = ""; if (Model.AuditDate.HasValue) { shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy"); //alternative way below //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d"); } } @shortDateLocalFormat 

Por encima de la variable @shortDateLocalFormat está formateada con ToString("M/d/yyyy") funciona. Si se ToString("MM/dd/yyyy") , como hice primero, terminas teniendo un problema de cero . También como funciona recomendado por Tommy ToString("d") también. En realidad, "d" significa “Patrón de fecha corta” y también se puede usar con diferentes formatos de cultura / idioma.

Supongo que el bloque de código de arriba también puede ser sustituido con algún método de ayuda genial o similar.

Por ejemplo

 @helper DateFormatter(object date) { var shortDateLocalFormat = ""; if (date != null) { shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy"); } @shortDateLocalFormat } 

se puede usar con esta llamada de ayuda

 @DateFormatter(Model.AuditDate) 

Actualización , descubrí que hay una forma alternativa de hacer lo mismo cuando se usa el método DateTime.ToString (String, IFormatProvider) . Cuando se utiliza este método, no es necesario utilizar la propiedad CurrentCulture Thread . CultureInfo("en-US") se pasa como segundo argumento -> IFormatProvider a DateTime.ToString(String, IFormatProvider) método.

Método de ayuda modificado:

 @helper DateFormatter(object date) { var shortDateLocalFormat = ""; if (date != null) { shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US")); } @shortDateLocalFormat } 

.NET Fiddle

He estado usando este cambio en mi código:

código antiguo:

   @Html.DisplayFor(modelItem => item.dataakt)  

nuevo:

  @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")  

Para mí fue suficiente usar

 [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] public DateTime StartDate { set; get; } 

Tal vez intente simplemente

 @(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty) 

también puede usar muchos tipos de formato de cadena como .ToString (“dd MMM, yyyy”) .ToString (“d”), etc.

Tuve un problema similar en mi controlador y aquí está lo que funcionó para mí:

 model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : "" 

“DateSigned” es el valor de mi modelo. La línea dice, si el valor del modelo tiene un valor, entonces formatee el valor; de lo contrario, no muestre nada.

Espero que ayude

Consulte esta respuesta sobre la No overload for method 'ToString' takes 1 arguments error de No overload for method 'ToString' takes 1 arguments .

No puede formatear un DateTime que admite nulos. Debe usar la propiedad DateTime.Value.

 @Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty 

Consejo: Siempre es útil trabajar estas cosas en una clase estándar con intellisense antes de ponerlo en una vista. En este caso, obtendría un error de comstackción que sería fácil de detectar en una clase.

Esta es la mejor manera de obtener una cadena de fecha simple:

  @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()