[英]Return Entity Framework Objects as 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);
}
進入頁面 /events/EventList/ 時出現服務器錯誤 500。 此外,Jquery 獲取請求不返回任何數據。 以 Json 格式返回結果的正確方法是什么?
更新:
這似乎有效。 但我需要來自數據庫的結果。
public ActionResult EventList() {
Event test = new Event
{
EventID = 1,
Title = "test",
Description = "test"
};
return Json(new { event = test }, JsonRequestBehavior.AllowGet);
}
編輯: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);
}
這基本上將序列化實體框架請求中包含的任何內容,同時忽略任何錯誤和引用循環。
這種方法的缺點是控制序列化的內容更難,如果您有性能意識,您可能需要開始使用類似的模式裝飾生成的實體框架類
// 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 };
}
編輯
重新發布經過測試的代碼
在控制器中:例如
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!');
});
///
是我對這個問題的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.