2014-12-25 70 views
0

我有兩個實體類DonorUser。供體是用戶的子類下面Web API參數綁定不起作用

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

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

給出如下所示的Web API控制器動作接收POST請求使用JSON數據在主體

public class DonorsController : ApiController { 

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

這裏是交請求的樣子

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"} 

問題是捐助者對象是空的(不爲空,但爲空,沒有將值應用於原型捐助者)。

如果更改施主對象和使用數據傳送對象(DonorDO)具有相同屬性但沒有任何繼承,則性能被正確地填充在該數據對象。例如,捐助者數據對象如下所示。

//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試試吧?順便說一下,您可以刪除FromBody屬性,因爲捐助者不是原始類型,所以它會自動從主體中獲取 –

+0

感謝您指出FromBody。我按照您的建議嘗試發送只有幾個字段而不是完整的JSON,但Donor對象的屬性值全爲空或默認值。輸入JSON中的值都不會應用於施主對象。 – Jatin

+0

你能解決這個問題的地方? – jarz

回答

0

我注意到你在發送到「http:// localhost:xxxxx/Donor/api/Donors/EditDonor」這是錯誤的,你需要POST到「http:// localhost:xxxxx/api /捐助者「(你只需要發佈到控制器的基地址,並且控制器名稱應該在之前的」api「之後)。

這個代碼是100%的工作:

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; } 
} 

現在,使用招我稱這種方法,你可以在波紋管圖片中看到,並在控制器方面,你可以看到通過捐贈者的說法。

Fiddler POST request/parameters

Visual Studio 2013 POST method Debug

希望這有助於。

+0

感謝您的努力,但我正在使用虛擬目錄/捐助者。所以我的POST網址是正確的。有一個基地網站www.somewebsite.org,我的應用程序作爲一個單獨的應用程序運行/ Donor虛擬目錄,也就是使用url www.somewebsite.com/donor。我有其他的路徑,如http:// localhost:xxxxx/Donor/api/Donors/SearchDonor正常工作,使用默認參數和模型綁定。 – Jatin

+0

沒問題,更改提琴手url中的url並嘗試編碼。 –