2015-10-20 124 views
3

我尝试返回实体框架对象为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); 
} 

我得到了一个服务器错误500进入页面/事件/ EVENTLIST /时。另外一个Jquery get请求不会返回任何数据。以Json格式返回结果的正确方法是什么?

更新:

这似乎是工作。但我需要数据库的结果。

public ActionResult EventList() { 

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

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

你是一个GET通话?如果是这样,你需要'返回Json(结果,JsonRequestBehavior.AllowGet);' –

+0

尝试添加.ToArray()结果:返回Json(results.ToArray()) –

+0

@StephenMuecke如果我添加JsonRequestBehavior.AllowGet);我得到的索引视图的HTML作为结果 –

回答

5

新的答案 - 更新的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(item, settings); 
} 

这基本上将序列化的被包含在实体框架的要求,而忽略了任何错误,并参考环路什么。

这种方法的缺点是什么控制序列得到比较难,如果你是有意识的表现,你可能需要使用类似

// a new partial class extending the Foo generated class, allowing us to apply an interface 
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 }; 
    } 

编辑

重新贴有测试代码

+0

它重定向到默认的错误页面(views/shared/error.chtml) –

+0

编辑了我刚刚尝试和测试过的东西的答案 – Craig