无法获取特定子页面的属性
Can't get Properties of a Specific Child Page
我 4 天前才开始使用 umbraco
,但一直被这个问题困扰。
我有一个名为 "About Us"
的页面,它是 "Home"
下的一个子页面,我需要在 "Home"
页面中获取它的一些属性。
我创建了一个局部视图宏来执行此操作,但我收到加载局部视图脚本的错误。
下面是我的代码:
@{ var selection = CurrentPage.Children.Where(x => x.Name == "aboutus"); }
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<div class="sc-inner">
<h4>
@item.PageTitle</h4>
<p>
@Umbraco.Truncate(@item.mainAboutDescription, 100)</p>
<a class="btn btn-danger" href="@item.Url">Read More...</a>
</div>
break;
}
</ul>
}
有人可以告诉我我做错了什么吗?
提前致谢。
编辑:
我得到的网站上的错误如下;
加载局部视图脚本时出错(文件:~/Views/MacroPartials/homePage_aboutUsSection.cshtml)
假设部分继承 UmbracoTemplatePage
CurrentPage
属性 是 dynamic
,您不能使用 lambda 表达式作为动态调度操作的参数。
如果您希望使用 Linq 查询内容,请使用 Model.Content
而不是 CurrentPage
,后者是一个 IPublishedContent
,例如
@{ var selection = Model.Content.Children.Where(x => x.Name == "aboutus"); }
注意:Name
属性 将 return 在 CMS 中输入的文件名称很可能是 'About Us' 而不是 'aboutus'
使用 about 将 return 和 IEnumerable<IPublishedContent>
因此您将需要使用 GetPropertyValue
方法而不是动态访问内容:
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{ var selection = Model.Content.Children.Where(x => x.Name == "aboutus"); }
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li class="sc-inner">
<h4>
@item.GetPropertyValue("pageTitle")
</h4>
<p>
@Umbraco.Truncate(@item.GetPropertyValue<string>("mainAboutDescription"), 100)
</p>
<a class="btn btn-danger" href="@item.Url">Read More...</a>
</li>
break;
}
</ul>
}
在您的代码中使用名称 属性 进行查询是非常糟糕的做法 - 例如,如果有人将名称更改为 About
会怎样。你的代码会中断。如果节点上还有其他独特的东西那就更好了。
例如,如果您的关于我们页面有一个 aboutUs 文档类型,您可以使用:
Model.Content.Children.Where(x => x.DocumentTypeAlias == "exactNameOfYourDocTypeAliasHere")
或者,虽然不是那么可靠,但是可以使用页面的 Id。
Model.Content.Children.Where(x => x.Id == 1234)
Id 比像这样的关键页面的名称更不可能更改。
我通常也不会在代码中使用 Id,但它比 Name 好得多
我 4 天前才开始使用 umbraco
,但一直被这个问题困扰。
我有一个名为 "About Us"
的页面,它是 "Home"
下的一个子页面,我需要在 "Home"
页面中获取它的一些属性。
我创建了一个局部视图宏来执行此操作,但我收到加载局部视图脚本的错误。
下面是我的代码:
@{ var selection = CurrentPage.Children.Where(x => x.Name == "aboutus"); }
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<div class="sc-inner">
<h4>
@item.PageTitle</h4>
<p>
@Umbraco.Truncate(@item.mainAboutDescription, 100)</p>
<a class="btn btn-danger" href="@item.Url">Read More...</a>
</div>
break;
}
</ul>
}
有人可以告诉我我做错了什么吗?
提前致谢。
编辑: 我得到的网站上的错误如下;
加载局部视图脚本时出错(文件:~/Views/MacroPartials/homePage_aboutUsSection.cshtml)
假设部分继承 UmbracoTemplatePage
CurrentPage
属性 是 dynamic
,您不能使用 lambda 表达式作为动态调度操作的参数。
如果您希望使用 Linq 查询内容,请使用 Model.Content
而不是 CurrentPage
,后者是一个 IPublishedContent
,例如
@{ var selection = Model.Content.Children.Where(x => x.Name == "aboutus"); }
注意:Name
属性 将 return 在 CMS 中输入的文件名称很可能是 'About Us' 而不是 'aboutus'
使用 about 将 return 和 IEnumerable<IPublishedContent>
因此您将需要使用 GetPropertyValue
方法而不是动态访问内容:
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{ var selection = Model.Content.Children.Where(x => x.Name == "aboutus"); }
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li class="sc-inner">
<h4>
@item.GetPropertyValue("pageTitle")
</h4>
<p>
@Umbraco.Truncate(@item.GetPropertyValue<string>("mainAboutDescription"), 100)
</p>
<a class="btn btn-danger" href="@item.Url">Read More...</a>
</li>
break;
}
</ul>
}
在您的代码中使用名称 属性 进行查询是非常糟糕的做法 - 例如,如果有人将名称更改为 About
会怎样。你的代码会中断。如果节点上还有其他独特的东西那就更好了。
例如,如果您的关于我们页面有一个 aboutUs 文档类型,您可以使用:
Model.Content.Children.Where(x => x.DocumentTypeAlias == "exactNameOfYourDocTypeAliasHere")
或者,虽然不是那么可靠,但是可以使用页面的 Id。
Model.Content.Children.Where(x => x.Id == 1234)
Id 比像这样的关键页面的名称更不可能更改。
我通常也不会在代码中使用 Id,但它比 Name 好得多