将实体框架对象作为JSON返回

4

我尝试在我的控制器中使用以下方法将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获取请求没有返回任何数据。以Json格式返回结果的正确方法是什么?
更新:这似乎可以解决问题,但我需要从数据库中获取结果。
   public ActionResult EventList() {

        Event test = new Event
        {
            EventID = 1,
            Title = "test",
            Description = "test"
        };

        return Json(new { event = test }, JsonRequestBehavior.AllowGet);
    }

1
你正在进行GET调用吗?如果是的话,你需要使用return Json(results, JsonRequestBehavior.AllowGet); - user3559349
@KirillBestemyanov 谢谢,但没有结果。 - Citizen SP
@JasonB,你是指HTML吗?- 你返回的是JSON,而不是视图。 - user3559349
@StephenMuecke 我知道...但出于某种原因,它现在显示视图的HTML源代码。 - Citizen SP
你是如何调用 EventList() 的? - markpsmith
显示剩余3条评论
2个回答

13

编辑: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 };
    }

编辑

使用经过测试的代码重新发布


它重定向到默认错误页面(views/shared/error.chtml) - Citizen SP
修改了答案,这是我刚尝试并测试过的内容。 - Craig

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

///

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


2
将“笑话”之类的文字输入到答案中会降低帮助性的印象。此外,请按照StackOverflow支持的方式进行求职,而不是通过在答案中偷偷摸摸地寻找工作。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接