4

필자는 공급자와 데이터를 게시 할 웹 API 컨트롤러가있는 ASP.NET Core 1 응용 프로그램을 작성하고 있습니다.ASP.NET Core 1 (RTM)의 Custom DateTime 모델 바인더

이것은 내가 들어오는 데이터를 바인딩 할 수있는 모델 클래스의 단순화 된 버전은 다음과 같습니다

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

문제는 날짜 인스턴스 30.09.2016를 들어, 독일어 서식 게시 될 것입니다. a) 나는 독일어가 아니므로 b) 응용 프로그램의 나머지 부분은 ISO 날짜와 함께 작동하므로 응용 프로그램의 글로벌 문화를 de-DE으로 설정하고 싶지 않습니다.

사용자 정의 IModelBinder을 작성했으며, ASP.NET Core MVC에서 명시 적으로 적용해야하므로 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 만, 즉, context.Metadata.ModelType == typeof(Lead)Lead 클래스에 명중되고 있다는 것입니다 :

다음은 IModelBinderProvider 내 구현입니다.

나는 모델 바인더에 이동, 우리는 DateTime 취급하지 않는 것을 볼 기대하고 다시 Lead 클래스의 모든 속성에 대해 제공됩니다.
이것은 분명히 사실이 아니며, 내 사용자 정의 IModelBinder에 결코 부딪치지 않습니다.

내가 IModelBinderProvider 인 것처럼 보이는 이유는 MVC 파이프 라인에 IModelBinder을 직접 등록 할 방법이 없다는 것을 알았 기 때문입니다.

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

가 어떻게 ASP.NET 코어 MVC는 Lead 클래스의 Date 속성에 내 사용자 지정 DateTime 바인더를 적용받을 수 있습니다 내가 대신 IModelBinderProvider를 등록이 ? 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'의'string' insetad를 가진 DTO로 해결 방법을 가지고 있습니다. 그리고 우리는 AutoMapper를 사용하여 날짜를 파싱합니다. 그래서이 문제는 내가 문제를 해결할 수있는 방법에 관한 것이 아니라 * 실제로 ASp.NET Core 1 *에서 사용자 정의 ModelBinder를 구현하는 방법입니다. –