español - asp.net mvc versions
@ Html.DisplayFor-DateFormat("mm/dd/aaaa") (14)
Consulte
esta respuesta
sobre el
No overload for method ''ToString'' takes 1 arguments
error de
No overload for method ''ToString'' takes 1 arguments
.
No puede formatear un DateTime anulable: debe usar la propiedad DateTime.Value.
@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty
Consejo: Siempre es útil resolver esto en una clase estándar con inteligencia antes de ponerlo a la vista. En este caso, obtendría un error de compilación que sería fácil de detectar en una clase.
Tengo el siguiente código de maquinilla de afeitar que quiero tener el 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 fecha de auditoría es una fecha y hora
DateTime?
tipo
He intentado algo como esto y obtuve este error:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
Información adicional: las plantillas se pueden usar solo con acceso de campo, acceso a propiedades, índice de matriz de una sola dimensión o expresiones de indexador personalizado de un solo parámetro.
Probé esto:
@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))
Ninguna sobrecarga para el método ''ToString'' toma 1 argumentos
Después de un poco de excavación y terminé configurando el valor
CurrentCulture
Thread
para tener
CultureInfo("en-US")
en el método de acción del controlador:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Estas son algunas otras opciones si desea tener esta configuración en cada vista.
Acerca del valor de la propiedad
CurrentCulture
:
El objeto CultureInfo("en-US") 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, las convenciones de mayúsculas y las comparaciones de cadenas.
Fuente: CultureInfo("en-US")
Nota:
La configuración anterior de la propiedad
CurrentCulture
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
Arriba, la variable
@shortDateLocalFormat
está formateada con
ToString("M/d/yyyy")
funciona.
Si se
ToString("MM/dd/yyyy")
, como lo hice primero, entonces terminas teniendo
un problema de cero
inicial.
También como lo recomienda
Tommy
ToString("d")
funciona.
En realidad,
"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 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
al
IFormatProvider
DateTime.ToString(String, IFormatProvider)
.
Método auxiliar modificado:
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
}
@shortDateLocalFormat
}
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 a dd / MM / aaaa, de lo contrario, déjelo como está porque no tiene valor.
Esta es la mejor manera de obtener una cadena de fecha simple:
@DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
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>
Implementé algo similar de esta manera:
- 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é cero contorno y cero borde a TextBox en css.
.my-style {
outline: none;
border: none;
}
Y ...... está hecho :)
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")
}
Esto se debe a que
.ToString()
para
Nullable<DateTime>
no acepta el parámetro
Format
.
Para mí fue suficiente usar
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
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; }
Puedes usar Convertir
<td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td>
Quizás intente simplemente
@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)
También puede utilizar muchos tipos de formato de cadena como .ToString ("dd MMM, aaaa") .ToString ("d"), etc.
Si simplemente está generando el valor de la propiedad de ese modelo, no necesita el ayudante
DisplayFor
html, solo
DisplayFor
directamente con el
formato de cadena adecuado
.
Audit Date: @Model.AuditDate.Value.ToString("d")
Debe salida
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 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 es de usar la palabra Modelo en sus ayudantes Html.
Por ejemplo, usando
@Html.DisplayFor(Model=>Model.someProperty)
.
Cambie estos para usar algo más que
Model
, por ejemplo:
@Html.DisplayFor(x=>x.someProperty)
o cambie la
M
mayúscula a una
m
minúscula en estos ayudantes.
Si utiliza
DisplayFor
, debe definir el formato mediante el atributo
DisplayFormat
o utilizar una plantilla de visualización personalizada.
(Puede encontrar una lista completa de los
DisplayFormatString
preestablecidos
here
).
[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
s, incluso a aquellos en los que 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 opción final es no usar
DisplayFor
y en su lugar representar la propiedad directamente:
@if (Model.AuditDate.HasValue)
{
@Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
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, formatee el valor; de lo contrario, no mostrará nada.
Espero que ayude