El formateador automático no funciona
-
22-07-2019 - |
Pregunta
Estoy intentando agregar un formateador a mi configuración de Automapper para diseñar todos los campos DateTime?
. Intenté agregar mi formateador globalmente:
Mapper.AddFormatter<DateStringFormatter>();
Y sobre el mapeo específico en sí:
Mapper.CreateMap<Post, PostViewModel>()
.ForMember(dto => dto.Published, opt => opt.AddFormatter<DateStringFormatter>());
Pero ninguno parece funcionar: siempre muestra la fecha en el formato normal. Como referencia, aquí está el ViewModel que estoy usando, y el resto de la configuración:
public class DateStringFormatter : BaseFormatter<DateTime?>
{
protected override string FormatValueCore(DateTime? value)
{
return value.Value.ToString("d");
}
}
public abstract class BaseFormatter<T> : IValueFormatter
{
public string FormatValue(ResolutionContext context)
{
if (context.SourceValue == null)
return null;
if (!(context.SourceValue is T))
return context.SourceValue == null ? String.Empty : context.SourceValue.ToString();
return FormatValueCore((T)context.SourceValue);
}
protected abstract string FormatValueCore(T value);
}
PostViewModel:
public int PostID { get; set; }
public int BlogID { get; set; }
public string UniqueUrl { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public string BodyShort { get; set; }
public string ViewCount { get; set; }
public DateTime CreatedOn { get; set; }
private DateTime? published;
public DateTime? Published
{
get
{
return (published.HasValue) ? published.Value : CreatedOn;
}
set
{
published = value;
}
}
¿Qué estoy haciendo mal?
¡Gracias!
Solución
Los formateadores solo se aplican cuando el tipo de miembro de destino es de tipo " string " ;. Desde " Publicado " es de tipo "Fecha y hora", el formateador nunca se aplica. Tienes algunas opciones aquí:
- Agregue una propiedad Publicada al objeto Publicar, con el comportamiento descrito anteriormente
- ¿Crear un solucionador personalizado para la propiedad Publicada, que primero resuelve el DateTime? valor de la lógica de propiedad, luego cambie el tipo de miembro de destino a cadena en Publicado. Primero, el resolutor se ejecutará. A continuación, el formateador toma el resultado de la resolución personalizada y, finalmente, el valor resultante se establece en Publicado
- Haz todo tu tipo personalizado - > Formateo de cadenas en la Vista, con cosas como un HtmlHelper
Por lo general, vamos por 1), a menos que el valor que se muestra sea realmente solo para esta vista, entonces vamos a la opción 2).
Otros consejos
Intenta hacerlo de esta manera:
Mapper.CreateMap<DateTime?, string>().ConvertUsing(d => d.Value.ToString("d"));
Puede cambiar la función para cumplir con sus requisitos.