2012-06-06 69 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; }' –