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

时间:2017-05-15 14:40:01

标签: razor foreach umbraco7 asp.net-mvc-5

我有一个显示我的网站导航的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

1 个答案:

答案 0 :(得分:0)

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

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

我使用强类型内容对象而非动态内容对象,因为a)它们更快,b)它们更容易使用。

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