2013-10-10 4 views
4

this question에서 확장하여 복잡한 개체 컬렉션이 포함 된 복잡한 개체를 ASP.NET 웹 API 컨트롤러 동작 메서드에 전달하려고 시도하지만 요청에서 내 입력 개체에 사용할 올바른 형식을 찾는 데 문제가 있습니다. 크리스토퍼 존슨의 질문의 예를 계속 (및 simplicty에 대한 일부 필드를 제거) 내가 전화 번호의 컬렉션을 포함하도록 자신의 PhoneRequest 객체를 변경하는 경우, ...복잡한 형식의 배열을 포함하는 복잡한 형식을 웹 API에 전달

public class PhoneRequest 
{ 
    public string[] PhoneNumbers { get; set; } 
    public string State { get; set; } 
} 

을 ... 그리고 나는대로 매개 변수를 전달 중 URL 인코딩 된 쿼리 문자열 :

/api/phonenumber?id[0][State]=UT&id[0][PhoneNumbers][0]=555-1234567 

... 또는 POST이 인코딩 된 HTML 형식으로 (Content-Type: application/x-www-form-urlencoded) 요청 본문 :

[0][State]=UT&[0][PhoneNumbers][0]=555-1234567 

... 모든 것이 잘 작동합니다. 하지만 ... 새로운 PhoneNumber 유형의 컬렉션에 문자열의 집합에서

public class PhoneRequest 
{ 
    public PhoneNumber[] PhoneNumbers { get; set; } 
    public string State { get; set; } 
} 
public class PhoneNumber 
{ 
    string AreaCode { get; set; } 
    string Number { get; set; } 
} 

PhoneNumbers를 변경 ... 나는 이전 주어진 논리적 방법으로 나에게 보이는 것을에서 개체를 전달하는 경우 결과는 ...

id[0][State]=UT&id[0][PhoneNumbers][0][AreaCode]=555&id[0][PhoneNumbers][0][Number]=1234567 

은 ... 또는 다시 HTML 폼 POST 본문 ...

[0][State]=UT&[0][PhoneNumbers][0][AreaCode]=555&[0][PhoneNumbers][0][Number]=1234567 

로 ... 그것은 여전히 ​​결합하는 시도를하고, 내 행동으로 얻는다 방법, 그러나 모델에는 상태 만 포함되어 있으며 전화 번호는 이상한 ComplexUriAndFormObject 것입니다. 여기 내 디버거에서 복사하여 붙여 넣기 :

phoneRequest {ComplexUriAndFormObject.Models.PhoneRequest[1]} 
    [0] {ComplexUriAndFormObject.Models.PhoneRequest} 
     PhoneNumbers {ComplexUriAndFormObject.Models.PhoneNumber[1]} 
     [0] {ComplexUriAndFormObject.Models.PhoneNumber} 
      AreaCode null 
      Number null 
     State "UT" 

이 형식을 사용하여이 개체를 올바르게 지정할 수있는 방법이 있습니까? 아니면 모델 바인더에 내장 된 ASP.NET 웹 API의 한계를 초과 했습니까?

참고 : "그냥 POST 사용"또는 "JSON/XML/무엇이든 콘텐츠 유형으로 사용"이라고 말하지 마십시오. 그렇게 할 수 있다면 그렇게 할 것입니다.

답변

8

지금까지 파생 된 FromUri 및 FromBody 특성을 포함한 기본 제공 웹 API 모델 바인더는 쿼리 문자열을 사용하여 비 기본 클래스 형식 (System.String 제외)의 속성을 포함하는 복잡한 개체를 전달하는 것을 지원하지 않습니다. 필자는 비슷한 문제를 가지고 있으며 고유 한 고급 사용자 지정 모델 바인더 인 FieldValueModelBinder 클래스를 만들어 일반 목록 또는 배열 컬렉션이있는 대상 개체 계층 구조에서 작업했습니다. 어떤 JSON이나 XML 구조도 삽입하지 않고 순수한 쿼리 문자열 형식의 소스 데이터를 사용할 수 있습니다. 모델 바인더는 FromUri 및 FromBody 속성처럼 쉽게 사용할 수 있습니다. 또한 URI와 요청 본문 모두에서 쿼리 문자열 데이터를 전송하는 데 효과적입니다.

내 기사를 읽고 소스 코드를 다운로드하십시오.이 링크를 사용하여 방금 게시했습니다 : http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects. 입력 문자열, 모델 및 결과에 대한 다운로드 소스에서 테스트 응용 프로그램을 실행할 수도 있습니다. 이것이 올바른 솔루션이되기를 바랍니다.

+0

정확히 내 문제를 해결합니다! 고마워, 그리고 오신 것을 환영합니다 :) –

관련 문제