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