2015-10-20 123 views
3

我嘗試返回實體框架對象爲JSON在我的控制器下面的方法:返回實體框架對象爲JSON

public JsonResult EventList() { 
     var results = from s in db.Events 
         select new 
         { 
          OrderID = s.EventID, 
          OrderTitle =s.EventType, 
          OrderDate = s.Title 
         }; 

return Json(results); 
} 

我得到了一個服務器錯誤500進入頁面/事件/ EVENTLIST /時。另外一個Jquery get請求不會返回任何數據。以Json格式返回結果的正確方法是什麼?

更新:

這似乎是工作。但我需要數據庫的結果。

public ActionResult EventList() { 

     Event test = new Event 
     { 
      EventID = 1, 
      Title = "test", 
      Description = "test" 
     }; 

     return Json(new { event = test }, JsonRequestBehavior.AllowGet); 
    } 
+1

你是一個GET通話?如果是這樣,你需要'返回Json(結果,JsonRequestBehavior.AllowGet);' –

+0

嘗試添加.ToArray()結果:返回Json(results.ToArray()) –

+0

@StephenMuecke如果我添加JsonRequestBehavior.AllowGet);我得到的索引視圖的HTML作爲結果 –

回答

5

新的答案 - 更新的2018:

原來答案在下面將工作每一次,如果你正在使用延遲加載,它可能仍然是最好的解決方案。沒有延遲加載雖然,你可以做Newtonsoft.JSON如下:

var settings = new JsonSerializerSettings() 
    { 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
     Error = (sender, args) => 
     { 
      args.ErrorContext.Handled = true; 
     }, 
    }; 

using(var context = new myContext()){ 
    var myEntity = myContext.Foos.First(); 
return JsonConvert.SerializeObject(item, settings); 
} 

這基本上將序列化的被包含在實體框架的要求,而忽略了任何錯誤,並參考環路什麼。

這種方法的缺點是什麼控制序列得到比較難,如果你是有意識的表現,你可能需要使用類似

// a new partial class extending the Foo generated class, allowing us to apply an interface 
public partial class Foo : IFooMetaData 
{ 
} 

// meta data interface, forcing json ignore on Foo.Bars 
public interface IFooMetaData 
{ 
    [JsonIgnore] 
    ICollection<Bar> Bars {get;set;} 
} 

原來的答覆圖案裝飾您生成的實體框架類 - 2015年:

可以得到這樣的迴應:

[ 
{ 
"OrderID": 1 
}, 
{ 
"OrderID": 2 
}, 
{ 
"OrderID": 3 
} 
] 

從這個:

public JsonResult Test() 
    { 
     var events = new List<Event>() 
     { 
      new Event() {EventId = 1}, 
      new Event() {EventId = 2}, 
      new Event() {EventId = 3} 
     }; 


     var results = events.Select(e => new 
     { 
      OrderID = e.EventId 
     }).ToList(); 

     return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
    } 

所以你應該是這樣的

public JsonResult Test() 
    { 
     var results = db.Events.Select(e => new 
     { 
      OrderID = e.EventId 
     }).ToList(); 

     return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
    } 

編輯

重新貼有測試代碼

+0

它重定向到默認的錯誤頁面(views/shared/error.chtml) –

+0

編輯了我剛剛嘗試和測試過的東西的答案 – Craig