2014-12-25 6 views
0

두 엔터티 클래스 DonorUser이 있습니다.웹 API 매개 변수 바인딩이 작동하지 않습니다.

public abstract class User { 
    [Key] 
    public long Id { get; set; } 
    ... 
}  

public class Donor : User { 
    public string AlternateMobileNumber { get; set; } 
    ... 
} 

주어진 아래 기증 아래와 웹 API 컨트롤러 액션 본문 JSON 데이터와 POST 요구를 수신 한 사용자의 서브 클래스이다

public class DonorsController : ApiController { 

    //POST: api/Donors/EditDonor 
    [HttpPost] 
    public HttpResponseMessage EditDonor([FromBody] Donor donor) { 
     ... 
    } 
} 
여기

POST 요청이

POST http://localhost:xxxxx/Donor/api/Donors/EditDonor HTTP/1.1 
Content-Length: 477 
Cache-Control: no-cache 
Content-Type: application/json;charset=UTF-8 
Accept: */* 
... 

{"Id":12,"UserId":"[email protected]","FirstName":"firstname9c","MiddleName":"M","LastName":"lastname9","Gender":"Male","MobileNumber":"7777777777","BloodGroup":"A+ve","OfficeLocality":{"Id":2,"Name":"Malad"},"ResidenceLocality":{"Id":2,"Name":"Malad"},"Organization":"organization9","Designation":"designation9","TimesDonated":1,"DateLastDonated":"Mon Dec 01 00:00:00 GMT+05:30 2014","LastDonatedAt":"Hosp 1","IsSDPDonor":false,"IsIntrestedDonor":false,"Comments":"Some Comment"} 
같다 어떻게

기증자 개체가 비어 있습니다 (null이 아니지만 비어 있음, prope에 값이 적용되지 않음). 기증자의 권리). 내가 기증자 객체를 변경 한 다음 속성을 제대로 데이터 객체에 채워됩니다 데이터 전송 개체 (DonorDO) 속성이 같은 있지만 상속없이를 사용하는 경우

. 예를 들어, Donor Data Object는 아래와 같습니다.

//Plain Data Transfer Object without inheritance 
public class DonorDO { 
    public long Id { get; set; } 
    public string AlternateMobileNumber { get; set; } 
    ... 
} 

DonorDO기증자 엔티티 객체가 바인딩 속성 없음 빈 남아있는 동안의 속성 값이 올바르게 바인딩 얻을 않습니다. 상속 또는 다른 문제와 관련이 있습니까?

+0

문제는 Json 형식 일 수 있습니다. Id 및 AlternateMobileNumber 속성 만 포함하는 간단한 Json으로 시도해보십시오. 그런데 Donor가 기본 유형이 아니므로 FromBody 속성을 제거 할 수 있으므로 본문에서 자동으로 가져옵니다. –

+0

FromBody에 대해 지적 해 주셔서 감사합니다. 전체 JSON 대신 두 개의 필드 만 보내도록 제안했지만 Donor 객체의 속성 값은 모두 null 또는 default입니다. 입력 JSON의 어떤 값도 Donor 객체에 적용되지 않습니다. – Jatin

+0

어디서 문제를 해결할 수 있습니까? – jarz

답변

0

"http : // localhost : xxxxx/Donor/api/Donors/EditDonor"로 잘못 게시되었습니다. "http : // localhost : xxxxx/api/기증자 "(컨트롤러 기본 주소에만 POST해야하며 컨트롤러 이름은 전에 없었던"api "뒤에 있어야합니다). 당신이 우는 소리 이미지에서 볼 수

using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

//[Authorize] 
public class DonorsController : ApiController 
{ 

    [HttpGet] 
    public Donor Get(int id) 
    { 
     return new Donor 
     { 
      Id = id, 
      AlternateMobileNumber = "0000", 
     }; 
    } 

    //POST: api/Donors/EditDonor 
    [HttpPost] 
    public HttpResponseMessage EditDonor([FromBody] Donor donor) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

public abstract class User 
{ 
    public long Id { get; set; } 
} 

public class Donor : User 
{ 
    public string AlternateMobileNumber { get; set; } 
} 

지금, 피들러를 사용하여 나는이 방법을 호출하고, 컨트롤러에 당신은 전달 된 기증자 인수를 볼 수 있습니다

이 코드는 100 % 작업입니다. 이 도움이

Fiddler POST request/parameters

Visual Studio 2013 POST method Debug

희망.

+0

노력에 감사하지만 가상 디렉터리/기부자를 사용하고 있습니다. 그래서 내 POST URL이 맞습니다. 기본 웹 사이트 www.somewebsite.org가 있고 응용 프로그램은/www.somewebsite.com/donor URL을 사용하여/Donor 가상 디렉터리와 별도의 응용 프로그램으로 실행됩니다. http : // localhost : xxxxx/Donor/api/Donors/SearchDonor 같은 다른 경로가 기본 매개 변수 및 모델 바인딩을 사용하여 올바르게 작동합니다. – Jatin

+0

문제 없습니다. 피들러 URL에서 URL을 변경하고 코드를 사용해보십시오. –

관련 문제