所以我正在重建一个最初位于 Umbraco 7 上的旧网站,并将其放到 Umbraco 8 上(是的,我知道它也接近 EOL,这只是为了安全措施)
我遇到的问题是构建导航菜单。
我可以让它提取正确的链接名称,但 URL 是错误的。
下面的代码显示了我如何获取菜单名称和链接,名称很好。但根据我的理解,链接存储在不同的成员中,而存储在 menuItem.URL() 中的链接不是我想要的。
` @foreach (var menuItem in root.MenuLink.Children())
{
var menuItemHasChildren = menuItem.Children.Any();
<li class="nav-level-1__item">
<a href="@menuItem.Url()" class="nav-level-1__link" data-tsat="nav-menu_item" data-nav-title="@menuItem.Name" target="@menuItem.Url()">
@menuItem.Name
</a>`
根据我的理解,有一种方法可以在 Umbraco 中强类型链接,但我不是 100% 确定如何做到这一点。
我可以通过执行以下操作找到我想要使用的正确链接:
将我的代码置于调试模式,并在 var menuItemHasChildren = menuItem.Children.Any(); 中放置一个断点
然后,当我将鼠标悬停在 menuItem 上时,它会弹出一个成员列表,在该列表中有一个名为“Link”的列表,在里面我可以单击 [0],然后会弹出另一个成员列表,里面有一个“url”,其中包含正确的网址。
问题是我不能只输入 menuItem.Link 因为它说 Link 不存在。
如何访问menuItem内的Link成员。
我尝试了不同的方法来访问 MenuItem 的 Link 成员,但没有任何结果。
我尝试使用此代码,但我只是得到一个空错误:
var umbracoLink = menuLink.Value<Umbraco.Web.Models.Link>("menuItem");
if (umbracoLink != null)
{
// Accessing the URL property of the Umbraco.Web.Models.Link object
var url = umbracoLink.Url;
<li class="nav-level-1__item">
<a href="@url" class="nav-level-1__link" data-tsat="nav-menu_item" data-nav-title="@menuItem.Name" target="@url">
@menuItem.Name
</a>
您是否使用 Zbu.ModelsBuilder 之类的工具为您的 Umbraco 项目生成强类型的已发布内容模型(后来已移至 Umbraco CMS 核心代码中。)?
如果是,您可以将对象转换为强类型模型并根据需要达到必要的属性。
这里是一个如何做到这一点的示例 - 另请参阅下面 Umbraco 论坛上回答的类似问题:
private static List<fields.Image> GetImageGalleryElementImages(IEnumerable<IPublishedContent> images)
{
var elementImages = new List<fields.Image>();
if (images != null && images.Any())
{
foreach (var item in images)
{
if (item is Image)
{
// CASTING: Cast item to ModelsBuilder model and reach its properties afterwards
var modelsBuilderValue = item as Image;
elementImages.Add(new fields.Image()
{
Url = modelsBuilderValue.Url,// todo: obsolete
Alt = modelsBuilderValue.Alt
});
}
}
}
return elementImages;
}