2012-10-25 1 views
2

나는Asp Net MVC 4 Web Api의 사용자 정의 모델 바인더에서 내 요청 컨텐츠에 대한 액세스 권한을 얻으려면 어떻게해야합니까?

Can I get access to the data that the .net web api model binding was not able to handle?

나는 내 자신의 사용자 정의 모델 바인더를 사용할 수있는 일이있어가, 그런 식으로 내가 완벽하게 사건을 처리 할 수있는 내 앞의 질문에 한 문제를 해결할 수있는 방법에 대해 생각하고있다 , 내가 예상하지 못한 데이터를 얻을 때 로그에 기록하십시오.

여기

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class CustomPersonModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var myPerson = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var myPersonName = bindingContext.ValueProvider.GetValue("Name"); 

     var myId = bindingContext.ValueProvider.GetValue("Id"); 

     bindingContext.Model = new Person {Id = 2, Name = "dave"}; 
     return true; 
    } 
} 

public class CustomPersonModelBinderProvider : ModelBinderProvider 
{ 
    private CustomPersonModelBinder _customPersonModelBinder = new CustomPersonModelBinder(); 

    public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType) 
    { 
     if (modelType == typeof (Person)) 
     { 
      return _customPersonModelBinder; 
     } 
     return null; 
    } 
} 

다음과 같은 클래스와 모델 바인더 내 컨트롤러 방법

public HttpResponseMessage Post([ModelBinder(typeof(CustomPersonModelBinderProvider))]Person person) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

이다하고 난

Post http://localhost:18475/00.00.001/trial/343 

{ 
     "Id": 31, 
     "Name": "Camera Broken" 
} 

이 작품 피들러를 사용하여 호출 된 위대한, 사용자 정의 모델 바인더를 사용하지 않고 나는 내 json 데이터에서 채워진 Person 객체를 얻는다. 내 포스트 메서드에서, 그리고 사용자 정의 모델 바인더를 사용하면 항상 사람 (ID = 2, Name = "dave")을 얻습니다.

문제는 내 사용자 정의 모델 바인더에서 JSon 데이터에 액세스 할 수 없다는 것입니다.

bindModel 메서드의 myPerson 및 myPersonName 변수가 모두 null입니다. myId 변수에는 343이 채워집니다.

내 BindModel 메서드 내에서 json의 데이터에 어떻게 액세스 할 수 있습니까?

+0

표시되지 않습니다. 기본 모델 바인더는 유효한 JSON을 잘 처리합니다. 너는 실제로 어떤 문제가 있니? –

답변

2

이 시도 : 당신이 Person``에 대한 사용자 정의 모델 바인더를 필요로하는 이유는

actionContext.Request.Content.ReadAsStreamAsync()