Carpeta de modelo DateTime personalizada en ASP.NET Core 1 (RTM)

Estoy escribiendo y la aplicación ASP.NET Core 1, que tiene un controlador API web donde el proveedor publicará los datos.

Esta es una versión simplificada de la clase Modelo a la que enlazaré los datos entrantes:

public class Lead { public int SupplierId { get; set; } public DateTime Date { get; set; } } 

El problema es que las fechas se publicarán con formato alemán, por ejemplo, 30.09.2016 . No quiero establecer la cultura global de la aplicación en de-DE porque a) no soy alemán, yb) el rest de la aplicación funcionará con fechas ISO.

Me puse a escribir un IModelBinder personalizado y, debido a que aparentemente es obligatorio en ASP.NET Core MVC, un IModelBinderProvider .

Aquí está mi implementación del IModelBinderProvider :

 public class GermanDateTimeModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); if (!context.Metadata.IsComplexType && context.Metadata.ModelType == typeof(DateTime)) return new GermanDateTimeBinder(); return null; } } 

El problema es que mi IModelBinderProvider solo está siendo golpeado para la clase Lead , es decir, context.Metadata.ModelType == typeof(Lead) .

Espero que la carpeta del modelo vea que no estamos tratando con un DateTime , seguimos adelante y luego regresamos por cada propiedad de la clase Lead .
Aparentemente, este no es el caso, y mi IModelBinder personalizado nunca se ve afectado.

La razón por la que digo que IModelBinderProvider parece ser obligatorio no es que no he encontrado ninguna manera de registrar directamente un IModelBinder en la tubería de MVC; Tengo que registrar un IModelBinderProvider en su lugar:

 public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(options => { options.ModelBinderProviders.Insert(0, new GermanDateTimeModelBinderProvider()); }); } 

¿Cómo puedo hacer que ASP.NET Core MVC aplique mi carpeta personalizada DateTime a la propiedad Date de la clase Lead ? ¿Hay tal vez una manera de omitir todo el negocio de IModelBinderProvider y usar solo un IModelBinder ?

¿Publicas tus valores como JSON? Si es así, le sugiero que registre un JsonConverter personalizado con JSON.NET. En el convertidor, usarás un JsonSerializer con una DateFormatString diferente, en este caso un formato de fecha en alemán. Todos los demás JsonSerializer no se ven afectados por esto.

 public class Startup { public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddJsonOptions(option => { option.SerializerSettings.Converters.Add(new LeadConverter()); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddDebug(); app.UseMvcWithDefaultRoute(); } } public class LeadConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new System.NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jsonSerializer = new JsonSerializer { DateFormatString = "dd.MM.yyyy" }; return jsonSerializer.Deserialize(reader); } public override bool CanConvert(Type objectType) => objectType == typeof(Lead); }