在 Razor 中循环通过动态节点的 RelatedLinks 属性 时出错

Error on looping through a RelatedLinks property of dynamic Node in Razor

我有一个显示我的站点导航的 Razor 部分:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    var home = CurrentPage.Site();
    umbraco.NodeFactory.Node navigationSettingsNode = MySite.Umbraco.NavigationSettings;
    dynamic navigationSettings = new umbraco.MacroEngines.DynamicNode(navigationSettingsNode.Id);
    var settings = home.Children.Where("DocumentTypeAlias == \"Settings\"").First();
}


@if (navigationSettings.HasValue("topNavigation"))
{
    <ul>
        dynamic topNavigation = navigationSettings.topNavigation;
        var topNavigation2 = settings.topNavigation;
        <span>@topNavigation</span>
        <span>@topNavigation2</span>

        foreach(dynamic item in topNavigation)
        {
        <li>
            <a href="@item.link" title="@item.title">@item.caption</a>
        </li>
        }
    </ul>

}

最初我循环浏览 topNavigation2 项,它们工作正常,没有问题。

现在我循环浏览 topNavigation 项目,它抛出一个错误:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'char' does not contain a definition for 'link'

我不想再使用 var 设置,我只想使用动态 navigationSettings 变量。为了获得正确的 navigationSettings 节点,我需要进行一些操作,并且我不想在我想使用它的每个视图中粘贴相同的代码,所以我希望它可以从 dll 访问并可以在任何地方使用。

我的 Umbraco 中的 navigationSettings 节点也在主要内容树之外,因此不是 Home 的子节点。

为什么它不起作用?两者

        dynamic topNavigation = navigationSettings.topNavigation;
        var topNavigation2 = settings.topNavigation;

产生相同的 json 结果并且都是动态对象。

如何让它正常工作?

我正在使用 MVC 5.2.3

看起来你的 topNavigation 属性 是一个字符串,所以当你在上面调用每个时,它会遍历字符串中的字符。

另外,不要使用 NodeFactory,它已被弃用。您应该改用 IPublishedContent。

我会使用强类型内容对象而不是动态内容对象,因为 a) 它们速度更快,并且 b) 它们更易于使用。

这里有一篇很棒的文章,解释了获取内容的不同方式:https://24days.in/umbraco-cms/2015/strongly-typed-vs-dynamic-content-access/