包含ASP中对象列表的objecresult.. NET MVC6 Web Api
本文关键字:NET MVC6 Web Api objecresult ASP 对象 列表 包含 | 更新日期: 2023-09-27 18:06:57
我开始掌握使用MVC 6创建API。我有几个简单的响应模型,我使用ObjectResult
如下:
[Route("api/foos")]
public class FooController : Controller
{
[HttpGet]
public IActionResult GetFoos()
{
return new ObjectResult(FooRepository.GetAll().Select(FooModel.From));
}
}
当FooModel
是一个包含几个属性的简单模型,甚至是一个简单类型的列表(如字符串)时,这工作得很好。
然而,我现在正试图遵循一个类似的模式,其中FooModel
包含其中的其他对象的列表,我想在我的JSON响应中显示这些很好的格式化的细节,作为对象数组。然而,对于下面的类,我得到"No response received"。
public class FooModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Bar> Bars { get; set; }
public FooModel(Guid id, string name, List<Bar> bars)
{
this.Id = id;
this.Name = name;
this.Bars = bars;
}
internal static FooModel From(Foo foo)
{
return new FooModel(foo.Id, foo.Name, foo.Bars);
}
}
public class BarModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public BarModel(Guid id, string name)
{
this.Id = id;
this.Name = name;
}
internal static BarModel From(Bar bar)
{
return new BarModel(bar.Id, bar.Name);
}
}
如果我将List<Bar>
更改为字符串列表,则响应将很好地显示字符串的JSON数组。我怎么能得到我的响应返回内部对象的列表作为对象数组在我的JSON响应?
我设法得到了我正在寻找的效果,但我不确定为什么这样做-如果有人知道为什么,请分享!我认为List<Bar>
没有序列化到Bar
对象数组的原因是因为Bar
在不同的项目中(因为它是我的解决方案的更深(域)层的一部分)。当我更改FooModel
以引用BarModel
的列表并通过更改FooModel
以使用静态BarModel.From
方法填充此列表来填充它时,它可以工作,如下所示:
public class FooModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<BarModel> Bars { get; set; }
public FooModel(Guid id, string name, List<Bar> bars)
{
this.Id = id;
this.Name = name;
this.Bars = bars.Select(BarModel.From).ToList();
}
internal static FooModel From(Foo foo)
{
return new FooModel(foo.Id, foo.Name, foo.Bars);
}
}
如果您的类看起来像使用EntityFramework CodeFirst方法时的常见设置
public class Foo
{
...
public int Id {get; set;}
public IEnumerable<Bar> Bars {get;set;}
...
}
public class Bar
{
...
public int FooId {get;set;}
public Foo Foo {get;set;}
...
}
由于引用循环,Foo不能被序列化。要使API返回正确序列化的JSON,您必须在bar类中为foo属性添加[JsonIgnore]
属性:
public class Bar
{
...
public int FooId {get;set;}
[JsonIgnore]
public Foo Foo {get;set;}
...
}
这是假设你使用NewtonsoftJson作为序列化器。
感谢@KiranChalla在@Ivans的回答中发表评论。这为我指明了正确的方向。