2013-01-02 25 views
0

我有一個控制器MVC使用Json.NET

[HttpPost] 
public ActionResult Index([DataSourceRequest]DataSourceRequest request) 
{ 
    var tickets = db.Tickets.Include(t => t.AreaOfBusiness).Include(t => t.Assignee).Include(t => t.Severity).Include(t => t.TicketStatu); 
    return this.Json(tickets.ToDataSourceResult(request)); 
} 

內部此代碼,但我得到

在序列化類型的對象時檢測到循環引用序列JSON「System.Data.Entity的.DynamicProxies.Ticket_2B104FE45830306408DA130C08090F61ADA6B8A0106592FECE85087B94B

推出KendoGrid時。

我看到NewtonSoft Json.Net可以處理循環引用。我無法理解如何使用它。

你能幫我修改代碼,以便使用Json.Net嗎?

Thanx提前!

+0

什麼回報'ToDataSourceResult '? –

+0

我想要使用NewtonSoft的Json.NET的equivelant代碼,這樣我就不必在我的模式中刪除主鍵和外鍵,以避免「Circular Reference」 – PanosPlat

+0

您可以將NewtonSoft Json.Net理解這一點嗎? –

回答

1

ToDataSourceResult返回對象DataSourceResult

劍道文檔

而序列化類型的對象時檢測到循環引用

這樣做的原因的錯誤是通過將JSON方法中使用的JavaScriptSerializer類不能序列含有循環引用的對象圖(互相參照)。最好的解決方案是使用View Model對象並避免序列化創建循環引用的屬性。查看"How do I avoid circular reference exceptions"常見問題解答部分了解更多信息。

see documentation

「如何避免循環引用異常?」

如果序列化對象包含循環引用,則JavaScriptSerializer類將引發異常。爲了避免使用視圖模型,並排除其創建循環引用

see example

More data

+0

Thanx爲您的答案和鏈接安德烈,但我覺得它必須削弱非常理智的數據庫架構,以便有一個特定的序列器正常工作。 Newtonsoft可以處理循環引用,因此我傾向於給它一個機會而不是忽略列和關係。 – PanosPlat

+0

請再次參閱http://goo.gl/rfrJK –

+0

Thanx!我可能很無聊,但我不能接受由具有PK和FK的關係數據庫模式生成的EF實體不能被Json-ed!我想要對KendoUIGrid採用ajax方法,並且我認爲Json是必須的。出於測試目的,我留下了5個表格,1個「主」和4個供應第一個FK的表格。你猜怎麼了?我得到了同樣的循環引用錯誤!我真的很失望:( – PanosPlat

1

或者......你可以啓用json.net功能序列化處理的對象

循環引用屬性

的global.asax.cs

System.Net.Http.Formatting.JsonMediaTypeFormatter jsonMediaTypeFormatter = GlobalConfiguration.Configuration.Formatters.OfType<System.Net.Http.Formatting.JsonMediaTypeFormatter>().FirstOrDefault(); 
jsonMediaTypeFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize; 
jsonMediaTypeFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 

記住禁用延遲加載,否則將下載整個數據庫,使用包括dbsets在這裏讓你想 的關係,並解析會像一本字典,現在json的,例如:https://gist.github.com/keesey/7995398