MVC控制器不返回JSON列表

时间:2017-03-15 11:31:30

标签: c# json asp.net-mvc

我在Controller中有这段代码:

  public JsonResult getSmetkiList()
  {
      List<smetki> smetkiLST = new List<smetki>();
      using (leskaEntities dc = new leskaEntities())
      {
          smetkiLST = dc.smetkis.OrderBy(a => a.smID).ToList();
      }
      return new JsonResult { Data = smetkiLST, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  }

如果我尝试访问列表我得到服务器错误500网络调试,并在浏览器中我有这个错误:

  

&#39; /&#39;中的服务器错误应用

     

ObjectContext实例已被释放,不能再用于需要连接的操作。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.ObjectDisposedException:ObjectContext实例已被释放,不能再用于需要连接的操作。

     

来源错误:

     

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

这是smetki类:

  public int smID { get; set; }
        [DisplayName("Dobavuvac")]
        public int firmaID { get; set; }
    [DataType(DataType.Date), DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd.MM.yyyy}"), DisplayName("Datum")]
        public DateTime datumSM { get; set; }

        [DisplayName("Beleska")]
        public string noteSM { get; set; }


        public virtual firmi firmi { get; set; }

        public virtual ICollection<trosoci> trosocis { get; set; }

        public List<trosoci> trosociL { get; set; }

        public decimal NetTotalTR
        {
            get
            {
                if (trosocis == null)
                {
                    return decimal.Zero;
                }
                return trosocis.Sum((trosoci i) => i.vkupnot);
            }
        }

3 个答案:

答案 0 :(得分:0)

现在我看到了您的smetki课程,我可以说问题是您正在尝试返回smetki的集合。

smetki类有一个引用集合(如ICollection<trosoci> trosocis)。它是一个虚拟集合,需要打开连接才能进行迭代。

因此,当您的using完成并且您尝试序列化为json这些引用集合时,它仍然在寻找已关闭(处置)的数据库连接。

解决方案非常简单:您只需要在没有链接集合的情况下转换(Map)smetki类(它可能被称为视图模型类)。而且,如果您需要序列化所有链接的实体/集合,那么您还需要为这些类创建视图模型。

希望这会有所帮助。

如果您还有任何问题,请随时提出。

答案 1 :(得分:0)

因为我有删除控制器,现在我从托管项目中反编译,并且通过反编译我有这个代码:

public JsonResult getSmetkiList()
        {
            List<smetki> data = new List<smetki>();
            using (leskaEntities leskaEntities = new leskaEntities())
            {
                leskaEntities.Configuration.LazyLoadingEnabled = false;
                data = (from a in leskaEntities.smetkis
                orderby a.smID
                select a).ToList<smetki>();
            }
            return new JsonResult
            {
                Data = data,
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }

使用此代码工作属性JSON结果列表。

当我尝试重新编写有问题的代码时,我有这个错误。

这是正确的代码:

public JsonResult getSmetkiList()
{
    List<smetki> datasm = new List<smetki>();
    using (leskaEntities dc = new leskaEntities())
    {
       dc.Configuration.LazyLoadingEnabled = false;
       datasm = dc.smetkis.OrderBy(a => a.smID).ToList();
    }
    return new JsonResult { Data = datasm, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}

答案 2 :(得分:0)

我假设您的smetki类来自数据库。它包含另一个类(trosoci)的外键。现在当你从数据库加载smetki时,它会进行延迟加载,这意味着它知道应该有一个trosoci,但是没有加载它的数据。

现在,当您尝试在视图中访问此trosoci的任何属性时,它需要在访问相关属性之前从数据库加载trosoci对象。由于数据库的上下文已经关闭,因此无法加载有问题的数据并抛出给定的异常。

可能的解决方案:

a)将延迟加载更改为急切加载(全局或专门用于trosoci dc.smetkis.Fetch(customer).OrderBy(a => a.smID).ToList();或者您的ORM的正确命令

b)将您需要的所有内容映射到模型中,同时您的上下文(使用)仍处于打开状态,以便您的代码可以再次向数据库询问缺少的数据

c)对对象进行虚拟序列化(使用JavaScriptSerializer),这将访问所有字段,从而从数据库加载它们。