【问题标题】:Model binding issue in ASP.NET WEB APIASP.NET WEB API 中的模型绑定问题
【发布时间】:2017-08-10 03:39:18
【问题描述】:

我在WEB API 项目中遇到了这个奇怪的问题。 这是我项目的代码sn-p:

模型类:

       [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 */
    }

我正在使用 fiddler 将以下 xml 发布到控制器:

    <StudentInfo xmlns:www.w3........ xmlns:something>
        <StudentId>ST00001</StudentId>
        <FirstName>John</FirstName>
        <LastName>Smith</LastName>
        <ContactNumber>9001236597</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 属性,但结果相同。我正在使用默认的 DataContractSerialization 并尝试使用 XMLSerialization 但没有用。

请让我知道我在这里缺少什么以及如何解决它。

【问题讨论】:

    标签: c# asp.net asp.net-web-api asp.net-web-api2


    【解决方案1】:

    根本原因是缺少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>9001236597</ContactNumber>
            <Gender>MALE</Gender>
            <Course>Computer Science</Course>
        </StudentInfo >
    

    【讨论】:

    • 添加 Order 属性后代码运行良好。非常感谢... :)
    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多