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

时间:2015-08-07 15:36:58

标签: c# rest asp.net-web-api2 asp.net-core-mvc

我正在尝试使用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响应中显示这些格式良好的详细信息,作为数组对象但是,通过以下课程,我收到“没有收到回复”。

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响应中的对象数组返回?

2 个答案:

答案 0 :(得分:0)

我设法得到了我想要的效果,但我不确定为什么这样做 - 如果有人知道为什么,请分享!我认为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);
    }
}

答案 1 :(得分:0)

如果使用EntityFramework CodeFirst方法时您的类看起来像这种普通设置

[JsonIgnore]

Foo由于引用循环而无法序列化。 为了使API返回正确的序列化JSON,您必须在Bar类中为Foo-Property添加public class Bar { ... public int FooId {get;set;} [JsonIgnore] public Foo Foo {get;set;} ... } 属性:

data.messages

这是假设您使用NewtonsoftJson作为序列化程序。

感谢@KiranChalla在@Ivans答案中的评论。这为我指明了正确的方向。