2017-08-10 36 views
1

我在我的WEB API項目中遇到了這個奇怪的問題。 這裏是我的項目的代碼片段:ASP.NET WEB API中的模型綁定問題

模型類:

 [DataContract] 
     public class StudentInfo 
     { 
     [Key] 
     [DataMember] 
     [StringLength(20)] 
     public string StudentId {get; set;} 

     [Key] 
     [DataMember] 
     [StringLength(20)] 
     public string FirstName {get; set;} 

     [Key] 
     [DataMember] 
     [StringLength(20)] 
     public string LastName {get; set;} 

     [DataMember] 
     [StringLength(20)] 
     public string ContactNumber {get; set;} 

     [DataMember] 
     [StringLength(20)] 
     public string Gender {get; set;} 

     [DataMember] 
     [StringLength(20)] 
     public string Course {get; set;} 

     [DataMember] 
     public DateTime? CreatedDate {get; set;} 
     } 

控制器類方法:

[Route("/Student/AddNewStudent")] 
    [HttpPost] 
    public IHttpActionResult AddNewStudent([FromBody]StudentInfo studentInfo) 
    { 
     /* Business Logic Here */ 
    } 

我使用小提琴手發佈如下XML到控制器:

<StudentInfo xmlns:www.w3........ xmlns:something> 
     <StudentId>ST00001</StudentId> 
     <FirstName>John</FirstName> 
     <LastName>Smith</LastName> 
     <ContactNumber>90</ContactNumber> 
     <Gender>MALE</Gender> 
     <Course>Computer Science</Course> 
     <CreatedDate /> -- Value assigned from controller code 
    </StudentInfo > 

成功調用Fiddler的方法,但並非所有屬性都與xml元素值綁定。

的studentInfo物體看起來是這樣的:

StudentId  ST00001 
    FirstNme   null 
    LastNme   null 
    ContactNumber null 
    Gender   null 
    Course   null 
    CreatedDate  01/01/0001T:00:00 -- Value is being changed by the controller 
              code later. 

我試圖消除DatContract和DataMember attrributes但結果卻是一樣的。我正在使用默認的DataContractSerialization,並且還嘗試使用XMLSerialization但沒用。

請讓我知道我在這裏丟失了什麼以及如何修復它。

回答

0

缺少根本原因Order屬性。我會更新你的模型如下,並預期它解析:

[DataContract] 
public class StudentInfo 
{ 
    [Key] 
    [DataMember(Order = 0)] 
    [StringLength(20)] 
    public string StudentId { get; set; } 

    [Key] 
    [DataMember(Order = 1)] 
    [StringLength(20)] 
    public string FirstName { get; set; } 

    [Key] 
    [DataMember(Order = 2)] 
    [StringLength(20)] 
    public string LastName { get; set; } 

    [DataMember(Order = 3)] 
    [StringLength(20)] 
    public string ContactNumber { get; set; } 

    [DataMember(Order = 4)] 
    [StringLength(20)] 
    public string Gender { get; set; } 

    [DataMember(Order = 5)] 
    [StringLength(20)] 
    public string Course { get; set; } 

    [DataMember(Order = 6)] 
    public DateTime? CreatedDate { get; set; } 
} 

也可以考慮在請求跳過CreatedDate因爲你期望的服務器,以填補它的主體應該如下所示(不要忘記將MvcApplication3.Controllers替換爲您的名稱空間:

<StudentInfo xmlns="http://schemas.datacontract.org/2004/07/MvcApplication3.Controllers"> 
     <StudentId>ST00001</StudentId> 
     <FirstName>John</FirstName> 
     <LastName>Smith</LastName> 
     <ContactNumber>90</ContactNumber> 
     <Gender>MALE</Gender> 
     <Course>Computer Science</Course> 
    </StudentInfo > 
+0

添加Order屬性後,代碼正常工作,非常感謝...... :) –