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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top