ASP.NET MVC 1.0和Castle ActiveRecord 2.0延迟加载

时间:2009-09-04 20:41:57

标签: asp.net-mvc lazy-loading castle-activerecord

如何从视图中访问ActiveRecord模型的延迟加载属性?

我有一个属于类别模型的新闻模型,两者都被标记为Lazy = true

通过在我的控制器中执行以下操作,我可以在视图中访问延迟加载的属性

using (new SessionScope())
{
    results = _service.FindAllNews(start, pageSize, new[] { Order.Asc("Id") });
    foreach (var result in results)
    {
        var category = result.Category;
    }
}
return View(results);

然后在我看来,我解析结果并使用以下

显示类别标题
<%= Html.Encode(item.Category.Title) %>

显然,如果我在控制器中没有引用该属性,那么在尝试在视图中调用该属性时会出现会话范围错误。

但这对我来说似乎不对。有没有更好的方法在到达视图之前初始化模型的延迟加载属性?我想我可以在模型中编写一个Init函数,但这看起来也不错。

2 个答案:

答案 0 :(得分:3)

我转向AR谷歌小组,找到了我想要的答案。我想我会与大家分享,以防其他人在寻找同样的事情。

要使用ActiveRecord更改为延迟加载创建和销毁会话范围的位置,您应该将以下内容添加到web.config中。

<system.web>
    <httpModules>
        <add 
            name="ar.sessionscope" 
            type="Castle.ActiveRecord.Framework.SessionScopeWebModule, Castle.ActiveRecord" />
    </httpModules>
</system.web>

这会更改创建和配置会话范围的位置,以匹配每个请求的会话范围http://www.castleproject.org/activerecord/documentation/trunk/usersguide/web.html

答案 1 :(得分:3)

简单的解决方案是:不要在视图中执行延迟加载。 根据定义,MVC中的视图没有任何业务加载。

由控制器执行此操作以便您可以测试此行为。

是的,您不需要在映射中设置它。您可以使用另一个Fetchmode查询对象,以便在一个特定情况下急切地加载它们。