我尝试使用Controller中的以下方法将实体框架对象作为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);
}
输入页面/ events / EventList /时出现服务器错误500。此外,Jquery get请求不返回任何数据。以Json格式返回结果的正确方法是什么?
更新
这似乎有效。但我需要数据库的结果。
public ActionResult EventList() {
Event test = new Event
{
EventID = 1,
Title = "test",
Description = "test"
};
return Json(new { event = test }, JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:8)
编辑:2019
这个答案仍然得到了回应 - 如果你正沿着这条路走下去,我真的建议你为自己保留未来的头痛并使用DTO。现在序列化你的实体可能会更快但是(而且我已经很难学会了这一点) - 你会在几年内讨厌自己。
新答案 - 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(myEntity, settings);
}
这基本上会序列化实体框架请求中包含的任何内容,同时忽略任何错误和引用循环。
这种方法的缺点是控制序列化的内容更难,如果你有性能意识,你可能需要开始使用像
这样的模式来装饰你生成的Entity Framework类。// 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年:
可以得到这样的答复:
[
{
"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 };
}
修改的
使用经过测试的代码重新发布
答案 1 :(得分:0)
在控制器中: 例如
List<categories> data = context.categories.toList(); //to here all right
现在,发送json结果的“数据”序列化问题... 我只是用一个结构体来替换列表如何???
观看:
在同一个控制器中......
struct categories_struct{
public fieldname {get;set;}
//the same for others firelds (same the model)
}
现在,在 ActionResult 或 jsonresult 中:
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);
在视图中:
$.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!');
});
///
是我对这个问题的解决方案