关于 c#:Return Entity Framework Objects as JSON

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
   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:

执行以下操作

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
    public JsonResult Test()
    {
        var results = db.Events.Select(e => new
        {
            OrderID = e.EventId
        }).ToList();

        return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }

编辑

重新发布测试代码


在控制器中:
例如

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!');
        });

////

是我对这个问题的解决方案