NancyFx超级简单视图引擎-替代Linq枚举
本文关键字:替代 Linq 枚举 引擎 超级简单 视图 NancyFx | 更新日期: 2023-09-27 18:30:07
我发现,如果在类型为IEnumerable<T>
的SSVE中公开Model上的公共属性,并从该属性返回Linq枚举,则SSVE似乎认为该集合中没有任何值(检查@If.HasValues
,因此@Model.Values
是可枚举的)。
例如,我的C#属性是:
public IEnumerable<string> Warnings
{
get
{
return WarningGenerators.SelectMany(w => w.GetWarnings());
}
}
在这种情况下,以下html根本不会显示在生成的页面中(它不存在于DOM中):
@If.HasWarnings
<div class="row">
<div class="col-lg-12">
@Partial['WarningsWidget.sshtml', Model.Warnings]
</div>
</div>
@EndIf
但如果我把C#改成这个(没有其他更改),html就会显示:
public IEnumerable<string> Warnings
{
get
{
return WarningGenerators.SelectMany(w => w.GetWarnings()).ToList();
}
}
显然,对ToList()
的调用正在枚举可枚举项,然后SSVE将拾取这些项。我很惊讶SSVE没有列举传递到它的集合。
这种行为是故意的吗?或者我错过了什么?
我对SSVE或Nancy不太了解,但我知道有时LINQ和实体框架不喜欢只在MVC页面上执行查询(这是您的第一个方法,因为SelectMany()
采用了延迟执行)。当您的查询完全在后端执行时(如使用.ToList()
,它采用立即执行),它往往更喜欢这样,因为项目已经加载到内存中。
如果这就是发生的事情,至少你可以放心地知道,在其他地方也会发生这种情况。