ASP.NET酷睿2的Web API模型
我找不到比这个教程从窗户就如何创建一个模型以外的任何文件:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-apiASP.NET酷睿2的Web API模型
到目前为止,一切都很好的ASP.NET核心基础知识,但我的模型比教程中的要复杂一些,我似乎无法在网上找到任何有关我的问题的文档。
我的模式是这样的:
public class Set
{
public int Id { get; set; }
public byte Rep { get; set; }
public int Weight { get; set; }
public int NumberOfDS { get; set; }
public double PercentDrop { get; set; }
public virtual Exercise Exercise { get; set; }
public int ExerciseId { get; set; }
}
public class Exercise
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Set> SetList { get; set; }
public byte RestTime { get; set; }
public virtual Workout Workout { get; set; }
public int WorkoutId { get; set; }
}
public class Workout
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Exercise> ExerciseList { get; set; }
public bool Archived { get; set; }
}
然后我的控制器看起来是这样的:
namespace WorkoutKeeper.Core.Controllers
{
[Route("api/[controller]")]
public class WorkoutController : Controller
{
public readonly ApiContext _context;
public WorkoutController(ApiContext context)
{
_context = context;
if (_context.WorkoutItems.Count()==0)
{
Workout wo1 = new Workout() { Name = "WO1" };
_context.WorkoutItems.Add(wo1);
_context.SaveChanges();
Exercise e1 = new Exercise() { Name = "E1", WorkoutId = wo1.Id };
_context.ExerciseItems.Add(e1);
_context.SaveChanges();
Set s1 = new Set() { Rep = 10, Weight = 50, ExerciseId = e1.Id };
_context.SetItems.Add(s1);
_context.SaveChanges();
}
}
[HttpGet]
public IEnumerable<Workout> GetAll()
{
return _context.WorkoutItems;
}
}
}
现在,如果我火起来,然后得到了http://localhost:55556/api/workout
,我收到一个不完整的JSON看起来像这样:
[
{
"id":1,
"name":"WO1",
"description":null,
"exerciseList":
[
{
"id":1,
"name":"E1",
"description":null,
"setList":
[
{
"id":1,
"rep":10,
"weight":50,
"numberOfDS":0,
"percentDrop":0.0
但是当我重新加载页面时,json现在像thi S:
[{
"id":1,
"name":"WO1",
"description":null,
"exerciseList":null,
"archived":false
}]
现在,我只是试图找出办法有数据之间的关系能够通过JSON发送完整的Workout
对象,而不是JSON与"setList":null
或不完整的一个。
谢谢!
您的模型有一个循环 - Workout
包含一个Exercise
的列表,并且每个Exercise
包含它所属的Workout
。当序列化程序尝试将对象格式化为JSON时,它会检测到此循环,并放弃并将属性保留为null
,或者抱怨循环引用。
您可以通过使用JsonIgnore
属性,以防止Exercise.Workout
被序列化,或者通过使用DataContract
和DataMember
属性明确标注哪些字段应被序列绕过这一点。您还需要对Set.Exercise
执行相同操作。
public class Exercise
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Set> SetList { get; set; }
public byte RestTime { get; set; }
[JsonIgnore]
public virtual Workout Workout { get; set; }
public int WorkoutId { get; set; }
}
public class Set
{
public int Id { get; set; }
public byte Rep { get; set; }
public int Weight { get; set; }
public int NumberOfDS { get; set; }
public double PercentDrop { get; set; }
[JsonIgnore]
public virtual Exercise Exercise { get; set; }
public int ExerciseId { get; set; }
}
这只是为我做了诡计!谢谢@ andrew-williamson –
你忘了补充一点,您所呼叫 –
您还没有分配'context'到'在控制器的构造函数_context'的动作,所以这甚至不会工作。请发布真实代码 –
我刚刚添加了该操作并编辑了'_context = context;'。当我复制我的代码时,我忘了它。 @CamiloTerevinto –