4

我正在编写和ASP.NET Core 1应用程序,它有一个Web API控制器,供应商将在其中发布数据。ASP.NET Core 1(RTM)中的自定义日期时间模型联编程序

这是Model类的简化版本,而我将绑定传入的数据:

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

的问题是,该日期将与德国的格式发布,例如,30.09.2016。我不想将应用程序的全球文化设置为de-DE,因为a)我不是德国人,b)其他应用程序将与ISO日期一起工作。

我已经设置为编写自定义IModelBinder,并且因为它显然是ASP.NET Core MVC中的必须项,所以它是IModelBinderProvider

这里是我实施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; 
    } 
} 

的问题是,我的IModelBinderProvider只被击中了Lead类,即context.Metadata.ModelType == typeof(Lead)

我希望模型绑定地看到,我们不是处理一个DateTime,继续前进,然后回来Lead类的每个属性。
这显然不是这种情况,我的自定义IModelBinder永远不会被击中。

我之所以说IModelBinderProvider似乎是强制性的原因是我没有发现任何方式直接注册到MVC管道IModelBinder;我注册代替IModelBinderProvider:

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

我怎样才能获得ASP.NET MVC的核心我的自定义DateTime粘合剂适用于Lead类的Date财产? 有没有办法跳过整个IModelBinderProvider业务,只使用IModelBinder

回答

1

您是否将您的值作为JSON发布? 如果是这样,我建议你用JSON.NET注册一个自定义的JsonConverter。 在转换器中,您将使用具有不同DateFormatString的JsonSerializer,在这种情况下为德国日期格式。 所有其他JsonSerializer不受此影响。

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<Lead>(reader); 
    } 

    public override bool CanConvert(Type objectType) => objectType == typeof(Lead); 
} 
+5

感谢您的回答,这确实是一个非常好的方法。然而,我们有一个解决方法,使用一个具有'DateTime'字符串插入的DTO,然后我们使用AutoMapper来解析日期。 所以这个问题不是关于如何解决这个问题,而是如何在ASp.NET Core 1 *中实际实现自定义ModelBinder –

相关问题