【问题标题】:WebApi c# rest web service can't pass list of objectWebApi c#rest web service不能传递对象列表
【发布时间】:2018-07-19 15:18:49
【问题描述】:

我正在构建一个简单的 rest full web 服务来将数据存储到数据库中。

这是我的代码:

[Route("InsertActivities")]
[HttpPost]
public HttpResponseMessage InsertActivities(ActivityExecutionDTO u)
{
    try
    {
        if (u != null)
        {
            //TO DO
        }

    }
    catch (Exception e)
    {

    }
}

这是 ActivityExecutionDTO 类:

namespace WebService.Models
{
    [DataContract(Name = "ActivityExecutionDTO")]
    public class ActivityExecutionDTO
    {
        [DataMember(Name = "Username", Order = 1)]
        public string UserName { get; set; }
        [DataMember(Name = "Password", Order = 2)]
        public string Password { get; set; }
        [DataMember(Name = "IdClinicalDocument", Order = 3)]
        public int IdClinicalDocument { get; set; }
        [DataMember(Name = "ActivityDetails", Order = 4)]
        public IQueryable<ActivityExecutionDetailDTO> ActivityDetails { get; set; }
    }
}

ActivityExecutionDetailDTO 类:

namespace WebService.Models
{
    [DataContract]
    public class ActivityExecutionDetailDTO
    {
        [DataMember(Name = "Id")]
        public int ID { get; set; }
        [DataMember(Name = "IdClinicalDocument"), IgnoreDataMember]
        public int IdClinicalDocument { get; set; }
        [DataMember(Name ="IdActivity")]
        public int IdActivity { get; set; }
        [DataMember(Name = "DateExecution"), IgnoreDataMember]
        public DateTime? DateExecution { get; set; }
        [DataMember(Name = "Duration")]
        public Int32? Duration { get; set; }
        [DataMember(Name = "CalBurned")]
        public Int32? CalBurned { get; set; }
        [DataMember(Name = "Steps")]
        public Int32? Steps { get; set; }
    }
}

这是我通过 PostMan 客户端传递的 JSON:

{
    "Username" : "t.g",
    "Password" : "t",
    "IdClinicalDocument" : 63,
    "ActivityDetails" :
    [
        {
            "Id" : 1,
            "IdClinicalDocument" : 63,
            "IdActivity" : 1,
            "DateExecution" : null,
            "Duration" :  150,
            "CalBurned" : 9600,
            "Steps" :  150
        }
    ]
}

所以如果我尝试检查我的代码,这段代码:

u.ActivityDetails

每次都为空。

活动列表为空。哪里出错了?

【问题讨论】:

  • 试试public HttpResponseMessage InsertActivities([FromBody] ActivityExecutionDTO u)
  • 对于初学者,您不希望跨层传递 IQueryables。这不能与 List 或 Array 互换,并且暴露了从不打算与数据库对话的系统部分访问数据的可能性
  • 补充@KyleBurns 所说的内容。将 DTO 更改为使用具体的 List&lt;ActivityExecutionDetailDTO&gt;Collection&lt;ActivityExecutionDetailDTO&gt;。反序列化为接口类型很困难(如果不是不可能的话)。模型绑定器应该使用什么具体实例?
  • 将 IQueryable 更改为 ICollection<...>

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


【解决方案1】:

IQueryable&lt;ActivityExecutionDetailDTO&gt; 更改为ICollection&lt;ActivityExecutionDetailDTO&gt;

IQueryable 只存储一个查询定义,其中不能有数据,而是 ICollection。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2012-11-15
    • 2011-06-22
    • 2016-08-10
    • 2013-01-31
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多