Для цикла в NVelocity - PullRequest
       19

Для цикла в NVelocity

4 голосов
/ 29 июля 2010

Поддерживает ли NVelocity циклы #for? Я просмотрел документацию, и все, что я мог найти, это цикл #foreach.

Я хочу перебрать двухмерный массив.

Ответы [ 3 ]

10 голосов
/ 29 июля 2010

Вы можете использовать оператор диапазона [n..m] в цикле foreach для эмуляции нормального цикла.Вы также можете получить доступ к элементам многомерного массива обычным способом, например $array[n][m].

Например, если у вас есть такой массив 2d (извините за код 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 

UPDATE :

Синтаксис в квадратных скобках был введен только в 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
1 голос
/ 08 ноября 2011

Увы, NVelocity "как есть" не поддерживает для циклов, только foreach .Даже ответвление Castle Project улучшает только цикл foreach.

AFAIK, для проектов .NET NVelocity находится в тупике.Мы используем его в наших проектах, используя код, похожий на lonely7345, для устранения его недостатков, и мы продолжали использовать его, потому что до недавнего времени не было лучшего или более простого движка шаблонов для .net.

Однако мы с учетом использования Razor в качестве автономного движка шаблонов ...

0 голосов
/ 16 октября 2011
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);
...