2012-06-06 73 views
0

这与昨天发布的帖子有关,但还没有能够解决:ASP.Net Web API showing correctly in VS but giving HTTP500C#从asp.net web api返回父子JSON对象?

我想我需要简化我想要做的事情,并从那里开始工作。

任何人都可以请我指出一个使用asp.net Web API(我使用VS 2012 Express RC)的例子,从父/子模型返回JSON吗?

如:(伪JSON):

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

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

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

感谢您的帮助,

马克

回答

0

看完你的原始文章后,我的猜测是你的对象中有循环引用。 This post引用了使用Json.Net,它可以让您更好地控制返回给客户端的内容。

您的其他选项是从tblRental对象(参见下文)中删除外键引用tblCustomerBooking

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

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

我不建议使用Json.NET如果您在返回的域(即实体对象),因为这将避免所有循环引用规划,让您保持双向对象关系。

我个人的偏好是使用DTO的并将你的Domain对象映射到这些DTO的,这样你就可以更好地控制客户端所看到的东西(因为在对象名中看到'tbl'前缀不是好习惯)

+0

嗨@Leon - 我使用VS 2012 RC,据我了解默认情况下使用Json.Net。你的意思是从模型中取出这两行:[ForeignKey(“customer_id”)] public virtual tblCustomerBooking tblCustomerBooking {get;组; } - 我是否也应该删除数据库中的tblRental表上的FK? (谢谢你的帮助) – Mark

+0

嗨@Leon - 谢谢 - 它确实看起来似乎是由上面提到的两行引起的“循环引用”。尽管我并不清楚为什么建议在其他许多帖子中都有这些内容,或者还有其他的后果,那就是删除它们。但现在,我得到了我的父/子关系以JSON格式无误地发回。感谢你和本周帮助过我的其他人 - 我非常感谢许多人的努力,包括filip-w mark和其他人。 – Mark

+0

嗨马克 - 您的欢迎,很高兴帮助 - 回答您关于要删除哪个属性的问题,它位于'tblCustomerBooking.customer_id'属性中。您也可以保留该属性,但使用'IgnoreDataMember',因此它不会被序列化。 [查看本文相关文章](http://stackoverflow.com/questions/10038628/error-when-serializing-ef-code-first-5-0-data-in-webapi-controller) - 看起来像一些人正与VS2012 RC一起遇到同样的“困境”。 – leon

0

有两种方式去走这一点。

  1. 创建一个新的模板类,循环访问使用EF提取的列表,并将值分配给模板类中定义的属性。如果有的话,这会给你一个到多个表的准确结果。最后将列表返回给json调用。

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

干杯!

+0

嗨@ Umar-Malik - 谢谢 - 我已经尝试过几种方法(在前面的文章中我已经提到过了),但即使有很多建议,也没有能够得到这个(表面上,简单)返回网络api。我希望看到一个非常简单的例子,然后我可以建立它 - 但无法超越起跑线! – Mark

+0

嗨@fixit示例代码为您的帮助是作为下:[WebMethod] public static IEnumerable loadAllNotes(string title,string body){MyFacade cf = new MyFacade(GetProfileCommonObject()。Personal.UserName,GetProfileCommonObject()。 Personal.tenantID,GetProfileCommonObject()。个人。用户名); List list = cf.loadAllNotes(title,body); IEnumerable newList = null; if(list.Count> 0) { newList = list.Select(x => new {x.Body,x.Title,x.CreatedDate,x.MyNoteID}); } return newList; }' –