【问题标题】:Dropdown menu dynamically "generated" from Umbraco backend possible?从 Umbraco 后端动态“生成”的下拉菜单可能吗?
【发布时间】:2017-05-02 18:15:25
【问题描述】:

我正在尝试用链接填充我的标题。我目前有两个下拉菜单。我想使用 Umbraco 和 Razor 填充链接,因此没有任何内容是硬编码的。这可以很容易地完成(参见下面的代码),但填充下拉列表是棘手的部分。

我不确定如何以一种好的方式填充下拉列表。它们不是子页面或类似的东西,但它们只是使标题不那么宽的下拉菜单。下面是我如何使用 Razor 通过抓取 Umbraco 中的链接来填充我的标题:

var home = CurrentPage.Site();

@foreach (var item in home.Children.Where("Visible"))
{
    <li class="@(item.IsAncestorOrSelf(CurrentPage) ? "active" : null)">
        <a href="@item.Url" class="nav-link">@Umbraco.GetDictionaryValue(item.Name)</a>
    </li>
}

home.Children.Where("Visible") 只是简单地抓取所有子页面,我没有检查umbracoNaviHide

这是目前我的标题是如何创建的,而不是使用 Umbraco(我需要使用来自 Umbraco 的页面来填充):

<nav class="navbar navbar-toggleable-lg navbar-light fixed-top">
  <div class="d-flex align-items-center justify-content-between">
    <button class="navbar-toggler navbar-toggler-left" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <a class="navbar-brand ml-3" href="/en">
      <img src="logo.png" class="logo" alt="logo">
    </a>
  </div>
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto justify-content-between full-width">
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          About
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
          <a class="dropdown-item" href="#">About Us</a>
          <a class="dropdown-item" href="#">History</a>
        </div>
      </li>
      <li>
        <a href="" class="nav-link">Our Products</a>
      </li>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href id="navbarDropdownMenuLink2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Resources
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink2">
          <a class="dropdown-item" href="#">Tips</a>
          <a class="dropdown-item" href="#">News</a>
        </div>
      </li>
      <li>
        <a href="" class="nav-link">Contact Us</a>
      </li>
    </ul>
  </div>
</nav>

这将产生如下结果:https://codepen.io/anon/pen/QvyeRm

我不希望任何链接受此影响,因为链接或页面实际上与标题的布局没有任何关系。以下是一些示例 URL:

/en/about-us/
/en/history/
/en/our-products/
/en/tips/

我希望这是有道理的。

有没有好的简单的方法来做到这一点?

【问题讨论】:

    标签: razor umbraco umbraco7


    【解决方案1】:

    有几种方法可以做到这一点。我通常在网站上进行主导航的方式是使用多个内容选择器或类似的方式让我选择要在导航中显示的项目。

    在您的示例中,您的子菜单项实际上并不在父菜单项下方。您可以为每个下拉菜单创建一个选择器,比如在您的主节点上,然后为每个下拉菜单选择页面?

    如果您打算使导航更加灵活,您可能需要做一些更花哨的事情,您可以查看嵌套内容包之类的东西来帮助您做到这一点?

    【讨论】:

    • 抱歉,很晚才回答。如果我想这样做,导航不会出现在我的所有页面上吗?我有一个主文档类型,其中基本上包含所有子页面。如果我在母版页上创建一个新属性(因为我希望它显示在所有页面上),该属性也会显示在子页面上。那不是很糟糕吗?因为我基本上只需要在我的 Master 上使用它。
    • 您应该只在主页节点上拥有该属性。如果您的所有页面都继承自它,那么正如您所说,您将遇到问题。不过,我通常不会让我的所有页面都从主页继承。
    • 如果你所有的页面都不是继承自你的母版页,那么你如何抓取所有的页面呢?如何创建一个所有页面都可以继承的属性(如 SEO 标题、描述等)?
    • 您可以使用合成。根据我的经验,这比继承要好得多,因为这意味着您不必继承不需要的属性。因此,您将有一个 SEO 组合,一个用于跟踪等。这里有一篇很好的博客文章:letswritecode.net/articles/…
    • 你能说几句吗?我似乎无法将所有这些事情都包裹起来,这真是太可惜了,因为我真的非常想要。我需要我所有的页面来继承 SEO。所有页面及其子页面都需要 SEO,所以我的主文档类型将有一个 SEO 属性选项卡,对吗?让我们想象一下,我希望在页脚上有一些属性,所有页面都有。页脚位于我的 Master .cshtml 文件中。我如何将属性仅放置在母版页上,而所有其他页面都不会从该母版页继承(在其他页面上拥有该属性是没有意义的)。
    【解决方案2】:

    所以我找到了一个很好的方法。我只需要创建一个文档类型设置为下拉的内容,然后设置标题(基本上是标签),然后为下拉的子项添加权限。

    @foreach (var item in selection)
    {
        if (item.GetPropertyValue<bool>("showDropdown"))
        {
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    @item.GetVortoValue("Title")
                </a>
                <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                    @foreach (var child in item.Children)
                    {
                        <a class="dropdown-item" href="@child.Url">@child.GetVortoValue("Title")</a>
                    }
                </div>
            </li>
        }
        else
        {
            <li>
                <a href="@item.Url" class="nav-link">@item.GetVortoValue("Title")</a>
            </li>
        }
    }
    

    我首先创建了一个名为“Dropdown”的文档类型。此文档类型的唯一目的是成为下拉列表中页面的父级。然后我设置权限以允许我必须在下拉列表中的两个页面,并在我的 Master 上设置权限以允许下拉文档类型。

    然后我在主文档类型上创建了一个新属性,称为“显示下拉菜单”。如果勾选此项,它将在页面上显示下拉菜单。我必须这样做,因为无论如何有孩子的页面 (if(item.Children.Any())) 都是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多