ASP.net Web api响应 - 循环数据

时间:2014-08-15 19:45:22

标签: c# asp.net asp.net-mvc json asp.net-web-api

我在我的MVC 5应用程序中使用ADO.net作为我的ORM工具,问题是:

  • 当我对我的web api进行一些POST操作并返回一些数据时,在我的响应中,JSON具有来自forign键的所有值,但我没有包含一些数据。

看看这个简单的界限:

    public async Task<IHttpActionResult> GetMyMessage(int id)
    {

        List<Messages> messages = await db.Messages.Where(a => a.GroupID == id).ToListAsync();


        return Ok(messages);

    }

问题在于我没有将任何数据(例如db.Messages.Include(某些东西......))包含到我的消息中但stil作为响应我得到了例如所有用户集合,以及我的其他东西消息表与DB连接。

我的全球性asax是:

protected void Application_Start()
    {

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

    }

有没有人知道如何摆脱这个链接表并有干净的json响应。否则我将不得不做一些解决方法并清理一下。 ?

2 个答案:

答案 0 :(得分:2)

这听起来像ViewModels的情况。您可以创建一个仅包含您关注该属性的属性的新类型,而不是返回Message实体。说你的实体看起来像:

public class Message {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual User User { get; set; }
    public virtual Group Group { get; set; }
}

public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

public class Group {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

您有一个端点,可以按组ID检索Message,但不希望获得有关UserGroup的任何信息。创建一个ViewModel来表示您想要的实际响应:

public class MessageViewModel {
    public int Id { get; set; }
    public string Name { get; set; }
}

然后将实体转换为ViewModel:

public async Task<IHttpActionResult> GetMyMessage(int id)
{
    var messages = await db.Messages.Where(a => a.Group.Id == id).ToListAsync();
    var models = messages.Select(
        m => new MessageViewModel {
            Id = m.Id, 
            Name = m.Name
        }).ToList();

    return Ok(models);
}

现在返回以下内容:

[{id: 1, name: 'SomeMessageName'}, {id: 2, name: 'SomeOtherMessageName'}, ...]

答案 1 :(得分:1)

您应该为上下文禁用延迟加载。我认为当您要返回的主要对象被序列化时,会加载相关实体。

Example from msdn:

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
}