@ Html.DisplayFor - DateFormat ("mm / dd / aaaa")

88

Tengo el siguiente código de maquinilla de afeitar que quiero tener mm/dd/yyyyformato de fecha:

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

He probado varios enfoques diferentes, pero ninguno de ellos 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 a campo, acceso a propiedad, índice de matriz de una dimensión o expresiones de indexación personalizadas de un solo parámetro.

Intenté esto:

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

Ninguna sobrecarga para el método 'ToString' toma 1 argumentos

Nick Kahn
fuente

Respuestas:

161

Si lo usa DisplayFor, debe definir el formato a través del DisplayFormatatributo o usar una plantilla de visualización personalizada. (Una lista completa de los preestablecida DisplayFormatString's se puede encontrar aquí .)

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

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

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

Sin DateTimeembargo, eso se aplicará a todos los correos electrónicos, incluso aquellos en los que también esté codificando la hora. Si desea que se aplique solo a propiedades de solo fecha, use Views\Shared\DisplayTemplates\Date.cshtmly el DataTypeatributo en su propiedad:

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

La última opción es no usar DisplayFory, en su lugar, representar la propiedad directamente:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Chris Pratt
fuente
He creado un displayTemplate como sugirió y cuando copio y pego el código que tiene en la plantilla, aparece este errorNo overload for method 'ToString' takes 1 arguments
Nick Kahn
3
Creo que debería ser[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: dd / MM / aaaa}")] trabajó para Turquía gracias
zapoo
@Mac: ¿Qué quieres decir? Ellos mucho hacer el trabajo, pero tal vez no en su situación específica. Sin más información, no puedo decir cuál es su situación.
Chris Pratt
Si desea que el editor a usar el formato aswell, añadir ApplyFormatInEditMode = truea la propiedad: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Debería ser obvio, pero cuando estás todo el no-tiempo-de-residuos-copiar-pegar esa pista de IntelliSense podría ir más allá de su nariz como lo hizo la mía :)
Heki
19

Si simplemente está generando el valor de esa propiedad del modelo, no necesita el DisplayForayudante html, simplemente llámelo directamente con el formato de cadena adecuado .

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

Debería salir

Audit Date: 1/21/2015

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

@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 se debe al uso de la palabra Modelo en sus ayudantes Html. Por ejemplo, usando @Html.DisplayFor(Model=>Model.someProperty). Cámbielos para usar algo diferente a Model, por ejemplo: @Html.DisplayFor(x=>x.someProperty)o cambie la mayúscula Ma minúscula men estos ayudantes.

Tommy
fuente
si lo usara @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Nick Kahn
@AbuHamzah: parece que todavía estás intentando poner esto en el Html.DisplayForayudante. No hagas eso. Además, ¿está seguro de que está arrojando el error en esa línea y no en alguna otra propiedad en la que está intentando usar el DisplayForayudante?
Tommy
Si utilicé @Model..., recibo este error: 'Modelo' entra en conflicto con la declaración System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn
@AbuHamzah Consulte el último párrafo de mi respuesta actualizada.
Tommy
11

He estado usando este cambio en mi código:

código antiguo:

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

nuevo:

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Piotr Mirek
fuente
... y? ¿Es esta una respuesta o qué?
Maciej Jureczko
Sí, es simplemente una solución al problema del tema. Pensé que esto podría ser útil para alguien.
Piotr Mirek
Bien, le sugiero que cambie "He estado usando este cambio en mi código" por algo que indique específicamente que esta es una solución.
Maciej Jureczko
Respuesta simple y conveniente, funcionó para mí gracias !!
Escáner
5

Implementé algo similar de esta manera:

  1. Use TextBoxFor para mostrar la fecha en el formato requerido y hacer 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 ... ya está hecho :)

Akshat
fuente
1
¿Pero por qué lo harías así?
CodeCaster
Porque ninguno de los otros métodos funcionó para mí y me ahorró mucho código. Además, el resultado final es de solo lectura y no tiene borde, por lo que no parecía un cuadro de texto.
Akshat
4

Para mi fue suficiente usar

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

Puede usar el atributo [ DisplayFormat ] en su modelo de vista ya que desea aplicar este formato para todo el proyecto.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Aung San Myint
fuente
2

Después de investigar un poco, terminé configurando Threadel valor CurrentCulture 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.

Sobre el CurrentCulturevalor de la propiedad:

El objeto CultureInfo que devuelve esta propiedad, junto con sus objetos asociados, determina el formato predeterminado para fechas, horas, números, valores de moneda, el orden de clasificación del texto, convenciones de mayúsculas y minúsculas y comparaciones de cadenas.

Fuente: MSDN CurrentCulture

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

Después de configurar la CurrentCulturepropiedad, agregue un bloque de código para convertir la fecha al "M/d/yyyy"formato 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 @shortDateLocalFormatvariable está formateada con ToString("M/d/yyyy")obras. Si ToString("MM/dd/yyyy")se usa, como lo hice primero, terminará teniendo cero problemas . También funciona como recomendado por Tommy ToString("d") . Realmente "d"significa "Patrón de fecha corta" y también se puede utilizar con diferentes formatos de cultura / idioma.

Supongo que el bloque de código de arriba también se puede sustituir por algún método de ayuda interesante o similar.

Por ejemplo

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

    @shortDateLocalFormat
}

se puede utilizar 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 Threadla CurrentCulturepropiedad de. Se CultureInfo("en-US")pasa como segundo argumento -> IFormatProvider al 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

jyrkim
fuente
1

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, aaaa") .ToString ("d") etc.

Wiizl
fuente
obteniendo el error: 'Modelo' entra en conflicto con la declaración 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn
si lo usé @modelno reconoce
Nick Kahn
@AbuHamzah - Me equivoqué, es mayúscula Mcuando se usa en la página HTML, minúscula mal declarar.
Tommy
sigue recibiendo el error, consulte Respondo a la respuesta de Tommy
Nick Kahn
1
No overload for method 'ToString' takes 1 argumentsquejándose cuando usoToString("mm/dd/yyyy")
Nick Kahn
1

En vista Reemplace esto:

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

Con:

@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}

Explicación: Si el valor de AuditDate no es nulo, formateará la fecha en dd / MM / aaaa; de lo contrario, déjela como está porque no tiene ningún valor.

usuario2298633
fuente
0

Tuve un problema similar en mi controlador y esto es 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

usuario3170254
fuente
0

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

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ahmad fatemh
fuente
Esto es lo que hace esta respuesta: toma la HtmlStringsalida DisplayFor, la convierte en a String, la analiza como a DateTimey luego la formatea como String. Innecesariamente complejo, en mi opinión.
Heretic Monkey
0

Podrías usar Convertir

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 
Karthik
fuente
-1

Vea esta respuesta sobre el No overload for method 'ToString' takes 1 argumentserror.

No puede formatear un DateTime que acepta valores NULL; debe usar la propiedad DateTime.Value.

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

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

NightOwl888
fuente
si uso el código sugerido, aparece este error'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn