【问题标题】:C# return a parent child JSON object from the asp.net web api?C#从asp.net web api返回一个父子JSON对象?
【发布时间】:2012-06-06 10:05:23
【问题描述】:

这与我昨天发的一个帖子有关,但无法解决:ASP.Net Web API showing correctly in VS but giving HTTP500

我认为我需要简化我正在尝试做的事情,并从那里开始工作。

谁能告诉我使用 asp.net Web API(我使用的是 VS 2012 Express RC)从父/子模型返回 JSON 的示例?

例如:(伪Json):

Parent: Mark
..Child: Tom
..Child: Adam
..Child: Becki

Parent: Terry
..Child: Sophie
..Child: robert

我可以让它从一个表中返回数据,但不能从链接表中返回数据。

感谢您的帮助,

标记

【问题讨论】:

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


    【解决方案1】:

    有两种方法可以解决这个问题。

    1. 创建一个新模板类,遍历使用 EF 获取的列表并将值分配给模板类中定义的属性。如果有的话,这将为您提供一个到多个表的准确结果。最后将列表返回给json调用。

    2. 从 EF 获取列表时,创建一个新的匿名类型并选择所需的列。为此,您的 webmethod 将返回类型为 IEnumerable

    干杯!

    【讨论】:

    • 嗨@Umar-Malik - 谢谢 - 我已经尝试了几种方法(在我上面提到的上一篇文章中),但即使有很多建议,也无法得到这个(在表面,简单)从 web api 返回。我希望看到一个非常简单的示例,然后我可以在此基础上进行构建 - 但无法越过起跑线!
    • 嗨@fixit 为您提供帮助的示例代码如下:[WebMethod] public static IEnumerable<object> loadAllNotes(string title, string body){ MyFacade cf = new MyFacade(GetProfileCommonObject().Personal.UserName, GetProfileCommonObject().Personal.tenantID, GetProfileCommonObject().Personal.UserID); List<MyNote> list = cf.loadAllNotes(title, body); IEnumerable<object> newList = null; if (list.Count > 0) { newList = list.Select(x => new { x.Body, x.Title, x.CreatedDate, x.MyNoteID }); } return newList; }
    【解决方案2】:

    查看您的原始帖子后,我的猜测是您的对象中有循环引用。 This post 提到了使用 Json.Net,这将使您能够更好地控制返回给客户端的内容。

    您的另一个选择是从tblRental 对象中删除外键引用tblCustomerBooking(见下文)。

    这可能允许您返回 JSON 对象并测试循环引用是否存在问题。

    [ForeignKey("customer_id")]
    public virtual tblCustomerBooking tblCustomerBooking { get; set; }
    

    如果您打算返回域(即实体对象),我建议您使用 Json.NET,因为这将避免所有循环引用,并允许您保持双向对象关系。

    我个人的偏好是使用 DTO 并将您的域对象映射到这些 DTO,让您可以更好地控制客户端看到的内容(因为在对象名称中看到“tbl”前缀并不是一个好的做法)

    【讨论】:

    • 嗨@Leon - 我正在使用VS 2012 RC,我知道它现在默认使用Json.Net。您的意思是从模型中取出这两行: [ForeignKey("customer_id")] public virtual tblCustomerBooking tblCustomerBooking { get;放; } - 我还应该删除数据库中 tblRental 表上的 FK 吗? (感谢您的帮助)
    • 嗨@Leon - 谢谢 - 它确实似乎是“循环引用”,这似乎是由上面提到的两行引起的。尽管我不是 100% 清楚为什么建议在许多其他帖子中使用这些行,或者删除它们的后果是什么。但就目前而言,我正在以 JSON 格式将我的父/子关系正确返回。感谢您以及本周帮助过我的其他所有人 - 我非常感谢这么多人的努力,包括 filip-w mark 和其他人。
    • 嗨,马克 - 欢迎您,很高兴它有帮助 - 回答您关于要删除哪个属性的问题,它位于 tblCustomerBooking.customer_id 属性上。您也可以保留该属性,但使用IgnoreDataMember,这样它就不会被序列化。 Check out this related post - 看起来有些人在使用 VS2012 RC 时遇到了同样的“问题”。
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多