簡體   English   中英

將實體框架對象作為 JSON 返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM