剃刀宏:将子节点划分为三个列表

时间:2013-07-07 14:10:35

标签: asp.net razor umbraco

我通过列出特定页面的子节点来创建一个页脚,其中包含umbraco 4.11.9中包含的示例(由changable source提供)。

页脚中的元素数量预计会发生变化,因此宏必须将子列表分开并将它们作为LI放在三个UL中。 所有的孩子都是源头的直接后裔

当前代码:

@inherits umbraco.MacroEngines.DynamicNodeContext

@{
    var startNodeID = "1089";
}

@if (startNodeID != null)
{
    @* Get the start node as a dynamic node *@
    var startNode = Library.NodeById(startNodeID);

    if (startNode.Children.Where("Visible").Any())
    {
        <ul>
            @foreach (var page in startNode.Children.Where("Visible"))
            { 
                <li><a href="@page.Url">@page.Name</a></li>
            }
        </ul>
    }    
}

2 个答案:

答案 0 :(得分:1)

在使用模数运算符之前,我做过类似的事情。请参阅以下示例:

var col1Count = 1;
var col2Count = 1;
var col3Count = 1;

<div class="col col-3 hide-mobile">
    @foreach (var nodeId in links)
    {
        if (col1Count % 3 == 1)
        {
          // Output column 1 content
        }
        col1Count++;
    }
</div>

<div class="col col-3 hide-mobile">
    @foreach (var nodeId in links)
    {
        if (col2Count % 3 == 2)
        {
          // Output column 2 content
        }
        col2Count++;
    }
</div>

<div class="col col-3 hide-mobile">
    @foreach (var nodeId in links)
    {
        if (col3Count % 3 == 0)
        {
          // Output column 3 content
        }
        col3Count++;
    }
</div> 

答案 1 :(得分:0)

这可能是一种有点直接的方法,但为什么不尝试(在你的if / .Any()中):

注意 - 此方法使用LINQ

    var childNodes = startNode.Children.Where("Visible").ToList();
    int perListCount = childNodes.Count;
    for (int i = 0; i < 3; i++){
      var activeNodeList = childNodes.Skip(i * perListCount).Take(perListCount);           
      if (i == 2){
        activeNodeList = childNodes.Skip(i * perListCount);
      }
      <ul>
      @foreach(var node in activeNodeList){
      <li><a href="@node.Url">@node.Name</a></li>
      }
      </ul>
    }