新的答案 - 更新的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 };
}
編輯
重新貼有測試代碼
你是一個GET通話?如果是這樣,你需要'返回Json(結果,JsonRequestBehavior.AllowGet);' –
嘗試添加.ToArray()結果:返回Json(results.ToArray()) –
@StephenMuecke如果我添加JsonRequestBehavior.AllowGet);我得到的索引視圖的HTML作爲結果 –