【问题标题】:ASP.net Web api response - looping dataASP.net Web api 响应 - 循环数据
【发布时间】:2014-10-09 14:03:57
【问题描述】:

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

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

看看这条简单的线:

    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(something...)),但作为响应,我得到了所有用户集合以及我的消息表中的其他内容在 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 响应。否则我将不得不做一些解决方法并稍微清理一下。 ?

【问题讨论】:

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


    【解决方案1】:

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

    Example from msdn:

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

    【讨论】:

    • 这也有效。谢谢
    【解决方案2】:

    这听起来像是 ViewModel 的一个案例。您可以创建一个新类型,而不是返回您的 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'}, ...]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2022-08-16
      • 2018-07-09
      • 2017-07-21
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多