【问题标题】:ASP.NET MVC: Force json serialization before exiting controller actionASP.NET MVC:在退出控制器操作之前强制 json 序列化
【发布时间】:2012-04-27 05:05:53
【问题描述】:

我有几个返回 json 对象的操作方法。例如:

public JsonResult MyAction()
{
  var entities = db.Entities.Include("Location").Where(e => e.Name != null);
  var model = entities.Select(e => new MyModel(e));
  return Json(model, JsonRequestBehavior.AllowGet);
}

在某些模型类中,我访问实体的内部元素,例如

public class MyModel
{
  private Entity _e;
  public MyModel(Entity e)
  {
    _e = e;
  }

  public string[] LocationName
  {
    get
    {
      return _e.Location.Name;
    }
  }
}

如果我将存储库 (db) 放在 Global.asax.cs 文件中的 OnRequestCompleted 之类的地方,这会很好用。 问题是,现在我在 BaseController 的 OnActionExecuted 方法中处理数据库,当对象被序列化时,它会失败,因为连接已经关闭。

我的问题是,OnActionExecuted 是处理数据库连接的正确位置还是应该在其他地方执行它? 如果可以在那里处理存储库,那么我如何“强制”序列化在我调用 Json(model) 的那一刻发生,这样之后就不会失败。

感谢您的帮助!

【问题讨论】:

    标签: asp.net-mvc json entity-framework serialization


    【解决方案1】:

    我认为真正的问题是您返回了一个需要连接的 IQueryable。

    最好决定何时执行查询,至少可以防止多次执行。

    如果你强制执行,你已经有结果了,你可以处置DB没问题。

    例子:

    public JsonResult MyAction()
    {
      var entities = db.Entities.Include("Location").Where(e => e.Name != null);
      var model = entities.Select(e => new MyModel(e))
                          .ToList(); // Execute IQueryable to get List<MyModel>
      return Json(model, JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • 实际上这并不完全正确,即使我使用 ToList() 它也只会获取实体,而不是位置。位置将在被访问时被检索,在这种情况下是序列化发生的时候。
    • 嗯,这意味着急切加载不起作用,它们仍被视为延迟加载属性,这是一个不同的问题。您是否尝试从模型中删除实体并在您选择的 lambda 中分配一个属性?
    猜你喜欢
    • 2010-12-01
    • 2011-02-26
    • 1970-01-01
    • 2010-11-23
    • 2011-07-13
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多