首页 \ 问答 \ 在Freemarker中包含带变量的模板(Include template with variable in Freemarker)

在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
更新时间:2023-02-22 11:02

最满意答案

取决于你喜欢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 exists
  • SingleOrDefault() - 如果空/未找到则返回默认值,如果存在重复则抛出

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() and SingleOrDefault() 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() and FirstOrDefault() stop on the first match, so they are more efficient.

Of the First() and Single() family, here's where they throw:

  • First() - throws if empty/not found, does not throw if duplicate
  • FirstOrDefault() - returns default if empty/not found, does not throw if duplicate
  • Single() - throws if empty/not found, throws if duplicate exists
  • SingleOrDefault() - 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查询语法的多少,可以直接使用扩展方法: 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 ...
  • 是的,这是正确的方法。 在那里用dataContext这个词dataContext判断,我假设这是Linq to SQL代码; 它会变成一个有效的TOP N查询。 (嗯,只要数据按日期进行索引,“高效”。) 我可能会改变的一件事是删除ToList() 。 除非你真的需要它是一个列表 , 通常最好将它作为一个IEnumerable放置,尤其是如果你只需要迭代它而不是按索引获取元素。 编辑:我应该通过参考ToList来更好地说明我的意思。 当您调用ToList ,您最终将得到一个包含该集合中所有元素的内存 ...
  • 一般来说,您的解决方案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 ...
  • 这是你在做什么!? var result = from item in db.Items join ci in db.ChainStoreItems on item.ItemId equals ci.ItemId where ci.ChainStoreId == 2 into itemci // ...
  • 您可以使用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 ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)