4

NVelocity 是否支持#for 循环?我浏览了文档,我能找到的只是#foreach 循环。

我想循环一个二维数组。

4

3 回答 3

10

您可以在 foreach 循环中使用范围运算符[n..m]来模拟正常循环。您还可以以通常的方式访问多维数组元素,例如$array[n][m].

例如,如果您有这样的二维数组(对不起 Java 代码):

String[][] testArray = new String[][] {{"a1","b1"},{"a2","b2"},{"a3","b3"}};

您可以像这样在 Velocity 中循环遍历它:

#set($sizeX = $testArray.size() - 1)
#set($sizeY = $testArray[0].size() - 1)
#foreach($i in [0..$sizeX])
    #foreach($j in [0..$sizeY])
        e[$i][$j] = $testArray[$i][$j] <br/>
    #end
#end

哪个输出:

e[0][0] = a1
e[0][1] = b1
e[1][0] = a2
e[1][1] = b2
e[2][0] = a3
e[2][1] = b3 

更新

根据变更日志,显然仅在 Velocity 1.7b1 中引入了括号语法。在旧版本中,我们只需要将括号替换get(i)为 Velocity 中的数组由ArrayList(在 Java 中)支持。所以,这应该工作:

#set($sizeX = $testArray.size() - 1)
#set($sizeY = $testArray.get(0).size() - 1)
#foreach($i in [0..$sizeX])
    #foreach($j in [0..$sizeY])
        e[$i][$j] = $testArray.get($i).get($j) <br/>
    #end
#end
于 2010-07-29T17:53:41.483 回答
1

唉,NVelocity“按原样”不支持for循环,只支持foreach。甚至Castle Project 的 fork也只改进了 foreach 循环。

AFAIK,对于 .NET 项目,NVelocity 处于死胡同。我们在我们的项目中使用它,使用类似于孤独7345 的代码来解决它的缺点,并且我们一直使用它,因为直到最近,没有更好或更简单的.net 模板引擎。

但是,我们正在考虑使用 Razor 作为独立模板引擎...

于 2011-11-08T13:25:39.923 回答
0
Hashtable entries = new Hashtable(StringComparer.InvariantCultureIgnoreCase);
entries["listtool"] = new ListTool();
VelocityContext context = new VelocityContext(entries);

在 listtool 类中,您编写 C# 代码来完成获取二维数组。

public Object get(Object list, int x,int  y)
    {
         return  ((IList)list)[x][y];
    }

$listtool.get($obj,x,y);
于 2011-10-16T03:45:09.717 回答