所以我有两个页面:frontpage.cshtml
和news.cshtml
。我的首页包含“服务”列表和“新闻”列表。当我想区分我拉出哪些时,我会这样做:
var selection = CurrentPage.Children.Where("Visible");
foreach(var item in selection) {
if(item.ContentType.Alias == "listNews") {
//I am dealing with news content/a news item
}
}
我必须这样做,因为我的所有内容/项目都位于相同内容“类型”下,如您所见:
这是非常糟糕的做法,因为我提取了所有项目/所有内容,即使我不需要它们。 ¨
这是奇怪的部分:无论我在哪个页面,我都会使用完全相同的代码。即使我在news.cshtml
页面上,它仍会提取服务。如何将它们分开,以便新闻页面有新闻,服务页面有服务,我的首页可以同时使用它们?
答案 0 :(得分:1)
这是一个很大的问题。真正快速的答案是你可以写下面的内容。您可以传递要过滤的文档类型的documentType别名。
<ul>
@foreach (var child in CurrentPage.Children("GeneralPage"))
{
<li>@child.Name</li>
}
</ul>
我非常喜欢的另一个选项是使用UmbracoHelper来帮助您查询XPath所需的内容。因为内容是在xml结构中缓存的,所以XPath查询非常快,而且非常正常。
@{
var news = Umbraco.TypedContentAtXPath("/root/LandingPage/NewsItem");
var services = Umbraco.TypedContentAtXPath("/root/LandingPage/Service");
}
<h2>News</h2>
<ul>
@foreach (var newsItem in news)
{
<li>@newsItem.Name</li>
}
</ul>
<h2>Services</h2>
<ul>
@foreach (var serviceItem in services)
{
<li>@serviceItem.Name</li>
}
</ul>
有更复杂的解决方案涉及RenderMvcControllers and route hijacking。如果您正在寻找更复杂的东西并且不喜欢在视图中完成所有这些工作的想法,那么您可以创建一些控制器来处理对特定文档类型的请求。在这些控制器中,您可以处理集合的所有过滤和umbraco的查询。然后,您可以将您关心的数据转发给您的观点。我知道你说你的问题的一部分是你的父节点下面有混合类型的包,所以这可能对你的问题没有帮助。很高兴知道RenderMvcControllers以任何一种方式存在。