ASP.NET MVC:在退出控制器操作之前强制 json 序列化



我有几个返回 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 文件中的 OnRequestDone 这样的地方,这就可以了。问题是现在我正在 BaseController 的 OnActionExecute 方法中处理数据库,当对象被序列化时,它会失败,因为连接已经关闭。

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

感谢您的帮助!

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

最好确定何时执行

查询,至少可以防止多次执行。

如果强制执行,则已经有了结果,并且可以毫无问题地处置数据库。

例:

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

最新更新