2017-08-10 15 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プロパティを追加した後にうまく働いたおかげでたくさん... :)。 –

関連する問題