2014-10-01 10 views
0

사용자 정의 IModelBinder를 사용하여 문자열을 NodaTime LocalDates로 변환하려고합니다. 내 LocalDateBinder은 다음과 같습니다 : 내 WebApiConfig에서 웹 API IModelBinder를 모든 유형의 인스턴스에 적용하십시오.

public class LocalDateBinder : IModelBinder 
{ 
    private readonly LocalDatePattern _localDatePattern = LocalDatePattern.IsoPattern; 

    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof(LocalDate)) 
      return false; 

     var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (val == null) 
      return false; 

     var rawValue = val.RawValue as string; 

     var result = _localDatePattern.Parse(rawValue); 
     if (result.Success) 
      bindingContext.Model = result.Value; 

     return result.Success; 
    } 
} 

내가 SimpleModelBinderProvider를 사용하여이 ModelBinder를, 라

var provider = new SimpleModelBinderProvider(typeof(LocalDate), new LocalDateBinder()); 
config.Services.Insert(typeof(ModelBinderProvider), 0, provider); 

내가 형 LOCALDATE의 매개 변수를 사용하는 작업을해야하는 경우에는 잘 작동하지만, 만약 등록 LocalDate를 다른 모델 내부에서 사용하는보다 복잡한 작업이 있지만 절대로 실행되지 않습니다. 예를 들어 :

[HttpGet] 
[Route("validateDates")] 
public async Task<IHttpActionResult> ValidateDates(string userName, [FromUri] LocalDate beginDate, [FromUri] LocalDate endDate) 
{ 
    //works fine 
} 

[HttpPost] 
[Route("")] 
public async Task<IHttpActionResult> Create(CreateRequest createRequest) 
{ 
    //doesn't bind LocalDate properties inside createRequest (other properties are bound correctly) 
    //i.e., createRequest.StartDate isn't bound 
} 

나는 이것이 내가 웹 API와 모델 바인더를 등록하고있어 어떻게 함께 할 수있는 뭔가가 그림,하지만 난 수정해야 내가이에 관해서 손실에 있어요 - 나는 정의를 필요합니까 바인더 공급자?

+0

누구든지이 문제를 해결하기 위해이 문제를 해결하지 못했습니다. 실제 문제는 내 JSON 직렬화 설정이 NodaTime 객체를 비 직렬화하는 방법을 얻고 있다는 것이 었습니다. 기본 DateTime 핸들러를 재정의해야했습니다. –

답변

1

CreateRequest은 모델 바인더의 유형 변환기가 정의되지 않은 복합 유형입니다. 이 경우 Web API는 미디어 형식 포맷터를 사용하려고 시도합니다. JSON을 사용하면서 표준 구성에서 Newtonsoft Json.Net 인 기본 JSON 포맷터를 사용하려고합니다. Json.Net은 Noda Time 유형을 처리하는 방법을 알지 못합니다. 예상대로

는 두 번째 예는 다음 작동합니다,이 후

public void Config(IAppBuilder app) 
{ 
    var config = new HttpConfiguration(); 
    config.Formatters.JsonFormatter.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); 
    app.UseWebApi(config); 
} 

... 당신이 NodaTime.Serialization.JsonNet를 설치하고 시작 코드에 이런 식으로 뭔가를 추가해야합니다, 노다 시간 유형을 처리 할 Json.Net이 수 확인하려면 입력이 올바른 형식의 노다 시간 형식이 아닌 경우 ModelState.IsValidfalse이됩니다.

웹 API의 매개 변수 바인딩에 대한 자세한 내용은 http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api을 참조하십시오.