Return Entity Framework Objects as JSON
我尝试在我的控制器中使用以下方法将实体框架对象作为 Json 返回:
1 2 3 4 5 6 7 8 9 10 11 | public JsonResult EventList() { var results = from s in db.Events select new { OrderID = s.EventID, OrderTitle =s.EventType, OrderDate = s.Title }; return Json(results); } |
我在进入页面 /events/EventList/ 时收到服务器错误 500。此外,Jquery 获取请求不返回任何数据。以 Json 格式返回结果的正确方法是什么?
更新:
这似乎有效。但我需要数据库的结果。
1 2 3 4 5 6 7 8 9 10 11 |
编辑:2019
这个答案仍然得到赞成 - 如果你要走这条路,我真的建议你只是避免未来的麻烦并使用 DTO。序列化你的实体现在可能更快,但是(我已经通过艰难的方式学到了这一点) - 几年后你会讨厌自己。
新答案 - 2018 年更新:
下面的原始答案每次都有效,如果您使用延迟加载,它可能仍然是最佳解决方案。虽然没有延迟加载,但您可以使用
执行以下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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(myEntity, settings); } |
这基本上会序列化实体框架请求中包含的任何内容,同时忽略任何错误和引用循环。
这种方法的缺点是控制什么被序列化比较困难,如果你有性能意识,你可能需要开始用像
这样的模式来装饰你生成的实体框架类
1 2 3 4 5 6 7 8 9 10 11 12 | // a new partial class extending the Foo generated class, allowing us to apply an interface [MetadataType(typeof(IFooMetaData))] public partial class Foo : IFooMetaData { } // meta data interface, forcing json ignore on Foo.Bars public interface IFooMetaData { [JsonIgnore] ICollection<Bar> Bars {get;set;} } |
原始答案 - 2015 年:
可以得到这个响应:
1 2 3 4 5 6 7 8 9 10 11 | [ { "OrderID": 1 }, { "OrderID": 2 }, { "OrderID": 3 } ] |
从此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 }; } |
所以你的应该是这样的
1 2 3 4 5 6 7 8 9 |
编辑
重新发布测试代码
在控制器中:
例如
1 | List<categories> data = context.categories.toList(); //to here all right |
现在,发送json结果的"data"序列化问题...
我只是用一个结构体来替换 List how???
就看:
在同一个控制器中...
1 2 3 4 | struct categories_struct{ public fieldname {get;set;} //the same for others firelds (same the model) } |
现在,在 ActionResult 或 jsonresult 中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | List<categorias> data = contexto.categorias.ToList(); //I use the EF List<catego> data2 = new List<catego>(); //create the struct var foreach (categorias item in data) //fill the struct with data { catego item2 = new catego(); item2.codcat = item.codcat; item2.nomcat = item.nombrecat; item2.descripcion = item.descripcion; data2.Add(item2); } //here, Data contains all data2 return Json(new { Data = data2 }, JsonRequestBehavior.AllowGet); |
在视图中:
1 2 3 4 5 6 7 8 9 10 11 | $.ajax({ url:"/Categorias/getTabla", dataType:"JSON", type:"POST", }).done(function (respuesta) { var data = JSON.parse(JSON.stringify(respuesta)); console.log(respuesta); alert('exito'); }).fail(function () { alert('oh no, again!'); }); |
////
是我对这个问题的解决方案