如何从视图中访问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函数,但这看起来也不错。
答案 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查询对象,以便在一个特定情况下急切地加载它们。