【发布时间】:2017-02-09 04:43:50
【问题描述】:
我正在编写 ASP.NET Core 1 应用程序,它有一个 Web API 控制器,供应商将在其中发布数据。
这是我将绑定传入数据的 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 似乎是强制性的,是因为我找不到将IModelBinder 直接注册到MVC 管道中的方法;我必须注册一个 IModelBinderProvider:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc(options =>
{
options.ModelBinderProviders.Insert(0, new GermanDateTimeModelBinderProvider());
});
}
如何让 ASP.NET Core MVC 将我的自定义 DateTime 绑定器应用于 Lead 类的 Date 属性?
有没有办法跳过整个IModelBinderProvider 业务而只使用IModelBinder?
【问题讨论】:
标签: c# asp.net-core-mvc model-binding custom-model-binder asp.net-core-webapi