我有一个显示我的网站导航的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
答案 0 :(得分:0)
看起来你的topNavigation属性是一个字符串,所以当你调用每个字符串时,它会遍历字符串中的字符。
另外,不要使用NodeFactory,它已被弃用。你应该使用IPublishedContent。
我使用强类型内容对象而非动态内容对象,因为a)它们更快,b)它们更容易使用。
这是一篇很棒的文章,解释了获取内容的不同方式:https://24days.in/umbraco-cms/2015/strongly-typed-vs-dynamic-content-access/