包含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响应?

包含ASP中对象列表的objecresult.. NET MVC6 Web Api

我设法得到了我正在寻找的效果,但我不确定为什么这样做-如果有人知道为什么,请分享!我认为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的回答中发表评论。这为我指明了正确的方向。