2012-04-27 46 views
2

我有几个返回json对象的动作方法。例如:ASP.NET MVC:在退出控制器动作之前强制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方法中,并且当对象正在序列化时,它会失败bc,连接已经关闭。

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

感谢您的帮助!

回答

1

我认为真正的问题是您要返回一个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); 
} 
+1

其实这不完全正确,即使我使用ToList(),它只会得到实体,而不是位置。这些位置在访问时将被检索,在这种情况下是序列化发生的时候。 – willvv 2012-04-27 16:42:42

+1

好吧,这意味着急切的加载不工作,他们仍然被视为懒加载属性,这是一个不同的问题。你是否试图从你的模型中取消这个实体,并在你选择的lambda中分配一个属性? – Meligy 2012-04-28 00:57:49