【发布时间】: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<ActivityExecutionDetailDTO>或Collection<ActivityExecutionDetailDTO>。反序列化为接口类型很困难(如果不是不可能的话)。模型绑定器应该使用什么具体实例? -
将 IQueryable
更改为 ICollection<...>
标签: c# rest asp.net-web-api