2016-06-13 23 views
0

我想將模型轉換爲JSON字符串,因爲我希望在此特定視圖中使用Knockout綁定。'The ObjectContext instance has been'in Razor's Html.Raw()

首先,我嘗試將模型轉換成JSON字符串,像這樣:

@{ 
    var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings(); 
    serializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
    var jsonData = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializerObject(Model, serializerSettings)); 
} 

在最後一行(實際換算),出現以下錯誤:

ObjectContext實例已被處置,不能再用於需要連接的操作

我的控制器只是從DB獲取對象,就像這樣:

public ActionResult Partner(int id) 
{ 
    using(var db = new DatabaseContext()) 
    { 
     var partner = db.Partners 
      .Include(x => x.OperatingCountries) 
      .Include(x => x.Secrets) 
      .FirstOrDefault(x => x.Id = id); 

     return View(partner); 
    } 
} 

我在另一個視圖中完成了同樣的操作,其中沒有發生此錯誤。這是什麼原因造成的,我該如何繼續?

+0

「合作伙伴」是否包含集合或複雜對象的屬性? –

+0

是的。其中兩個是確切的; '公共虛擬ICollection '和'公共虛擬ICollection ' – Detilium

+0

您可能需要在查詢中使用'.Include()'來加載它們。 –

回答

0

來自實體框架的實體對象不應該用於序列化。將這些對象存儲在分佈式緩存中時會發生同樣的問題。

如果您仍想使用實體對象進行序列化,請禁用延遲加載。

context.Configuration.LazyLoadingEnabled = false; 
+0

所以基本上只是建立一個包含與EF對象相同的數據的模型? – Detilium

+0

創建單獨的模型將起作用。避免延遲加載也將起作用。在查詢之前,禁用延遲加載。如果禁用延遲加載,則不需要包含,除非視圖中需要該數據。 – vijayst