c# - 将 Entity Framework 对象作为 JSON 返回

标签 c# json asp.net-mvc entity-framework asp.net-mvc-4

我尝试在我的 Controller 中使用以下方法将 Entity Framework 对象作为 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);
    }

最佳答案

编辑:2019

这个答案仍然得到支持 - 如果你要走这条路,我真的建议你只是为了避免 future 的头痛并使用 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 请求中包含的所有内容,同时忽略任何错误和引用循环。

此方法的缺点是控制序列化的内容比较困难,如果您注重性能,您可能需要开始使用类似模式装饰生成的 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 };
    }

编辑

重新发布测试代码

关于c# - 将 Entity Framework 对象作为 JSON 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236103/

相关文章:

C# 以可变参数列表作为参数传递函数

c# - 如何访问自定义 ValidationAttribute 中的存储库?

json - 如何在 swift 4 中显示子 JSON 数据?

java - 获取列名称 (元数据) Talend

json - 在 BigQuery 中迭代 ARRAY<JSON>

c# - 在 post 请求 asp.net mvc 中更改模型属性

c# - 用于 Linux 的 weifenluo.winformsui.docking dll

asp.net-mvc - IIS 如何识别请求是针对 MVC Controller 还是 Web 表单页面?

c# - MVC 5 在一个 View 上多次提交

c# - 将字符串转换为枚举?