在Freemarker中包含带变量的模板(Include template with variable in Freemarker)
在Freemarker中,我的模型中有一个变量template,其值为“index.ftl”。 然后我有一个模板,看起来像这样:
<html> <head> </head> <body> <#include $template> </body> </html>
但是,这是一个错误:
Caused by: freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: ==> [in template "template.tfl" at line 5, column 11]
但是,如果我将变量包含在标准的
${template}
表达式中,则字符串“index.tpl”会按预期显示在页面上。 为什么会这样? 使用可变路径包含模板的正确方法是什么?谢谢。
In Freemarker, I have a variable in my model, template, which has the value "index.ftl". I then have a template which looks like this:
<html> <head> </head> <body> <#include $template> </body> </html>
However, this is throwing an error:
Caused by: freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: ==> [in template "template.tfl" at line 5, column 11]
However, if I include the variable with the standard
${template}
expression, the string "index.tpl" shows up on the page as expected. Why is this happening? And what is the correct way of including a template with a variable path?Thanks.
原文:https://stackoverflow.com/questions/34970327
最满意答案
取决于你喜欢linq查询语法的多少,可以直接使用扩展方法:
var item = Items.First(i => i.Id == 123);
并且如果您不想在列表为空时抛出错误,请使用
FirstOrDefault
返回元素类型的默认值(引用类型为null
):var item = Items.FirstOrDefault(i => i.Id == 123); if (item != null) { // found it }
也可以使用
Single()
和SingleOrDefault()
,但是如果您正在从数据库读取或已经保证唯一性的内容,那么我不用担心,因为它必须扫描列表以查看是否有重复和抛出。First()
和FirstOrDefault()
在第一个匹配上停止,所以它们更有效率。在
First()
和Single()
系列中,这里是他们抛出的地方:
First()
- throws如果空/未找到,不抛出,如果重复FirstOrDefault()
- 如果空/未找到,则返回默认值,如果重复则不返回Single()
- throws if empty / not found,throws if duplicate existsSingleOrDefault()
- 如果空/未找到则返回默认值,如果存在重复则抛出Depends how much you like the linq query syntax, you can use the extension methods directly like:
var item = Items.First(i => i.Id == 123);
And if you don't want to throw an error if the list is empty, use
FirstOrDefault
which returns the default value for the element type (null
for reference types):var item = Items.FirstOrDefault(i => i.Id == 123); if (item != null) { // found it }
Single()
andSingleOrDefault()
can also be used, but if you are reading from a database or something that already guarantees uniqueness I wouldn't bother as it has to scan the list to see if there's any duplicates and throws.First()
andFirstOrDefault()
stop on the first match, so they are more efficient.Of the
First()
andSingle()
family, here's where they throw:
First()
- throws if empty/not found, does not throw if duplicateFirstOrDefault()
- returns default if empty/not found, does not throw if duplicateSingle()
- throws if empty/not found, throws if duplicate existsSingleOrDefault()
- returns default if empty/not found, throws if duplicate exists
相关问答
更多-
您可以编写自己的LINQ查询运算符(即IEnumerable
上的扩展方法 ),例如: static IEnumerable WithoutLast (this IEnumerable source) { using (var e = source.GetEnumerator()) { if (e.MoveNext()) { for (var value = e.Current; e.MoveNext(); valu ... -
var elements = items.Where(x => x.Nutrients.Any(a => !string.IsNullOrEmpty(a.cholesterol))) .Select(x => x.GeneralName) .ToList(); 这将为您提供所有GeneralName值的列表,其中包含Nutrients集合包含非空胆固醇值。 这是你在找什么? 编辑: 有没有办法可以获得这些项目的display_name? var elements = items.Where(x ...
-
Linq代码选择一个项目(Linq code to select one item)[2023-12-13]
取决于你喜欢linq查询语法的多少,可以直接使用扩展方法: var item = Items.First(i => i.Id == 123); 并且如果您不想在列表为空时抛出错误,请使用FirstOrDefault返回元素类型的默认值(引用类型为null ): var item = Items.FirstOrDefault(i => i.Id == 123); if (item != null) { // found it } 也可以使用Single()和SingleOrDefault() , ... -
如果这些集合将会变得很大,那么我建议使用连接。 它看起来像这样: var result = myFilters.Any() ? from item in myCollection join filter in myFilters on item.Name equals filter into gj where gj.Any() select item : myCollection; 使用连接的机会很容易被忽视 ...
-
使用GroupBy和First方法组合: var results = source.GroupBy(x => x.Id).Select(g => g.First()).ToList(); 或者作为基于语法的查询: var results = (from i in source group i by i.Id into g select g.First()).ToList(); Use GroupBy and First method combi ...
-
使用LINQ选择n最大(select n largest using LINQ)[2020-01-07]
是的,这是正确的方法。 在那里用dataContext这个词dataContext判断,我假设这是Linq to SQL代码; 它会变成一个有效的TOP N查询。 (嗯,只要数据按日期进行索引,“高效”。) 我可能会改变的一件事是删除ToList() 。 除非你真的需要它是一个列表 , 通常最好将它作为一个IEnumerable放置,尤其是如果你只需要迭代它而不是按索引获取元素。 编辑:我应该通过参考ToList来更好地说明我的意思。 当您调用ToList ,您最终将得到一个包含该集合中所有元素的内存 ... -
用linq选择2个元素(Select 2 elements with linq)[2023-09-08]
一般来说,您的解决方案1应该更快,因为它只是一次往返数据库。 但是,这种差异是否显着取决于您的使用情况。 这是一个替代解决方案,只能从数据库中取回城市名称(vs带回所有列)。 CityId ,这可能看起来像一个低效的笛卡尔产品,但数据库引擎很可能会优化这一点,尤其是在CityId列上存在索引的CityId 。 var result = from city1 in CityQuery where city1.CityId == City1Id from city2 in CityQu ... -
您可以创建扩展方法来执行所有操作。 例: static class Extensions { public static DataStruct Filter(this IEnumerable
collection) { if (collection == null) { return null; // or throw if you like } return collection ... -
LINQ选择问题(LINQ select problems)[2022-07-10]
这是你在做什么!? var result = from item in db.Items join ci in db.ChainStoreItems on item.ItemId equals ci.ItemId where ci.ChainStoreId == 2 into itemci // ... -
将项目计数添加到LINQ选择(add item count to LINQ select)[2022-12-16]
您可以使用GroupBy在查询本身中执行Count : return Tickets .Where(t => t.Kategorie != Kategorie.Invalid && t.Kategorie != Kategorie.None && t.Kategorie != null) .GroupBy(t => t.Kategorie.ToString()) .Select(g => new KategorieVM() { _name ...