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 –

相關問題