如何使用模型获取当前页面的子项列表?
我尝试为登录页面创建一个ViewModel,该登录页面具有List类型的字段,但是从Sitecore.Data.Items.Item转换为MyModel时仍然出现错误。
更新
我能够使用View Rendering,但是想要创建一个Model,这样我就可以拥有强类型对象。这是我正在尝试做的示例代码:
我正在尝试创建一个登录页面,该页面将返回所有类型为Article的子项。我可能需要做一些过滤/缩短,所以想创建一个可以使用的模型在这里会有所帮助。
public class Article
{
public string Title { get; set; }
public string ShortSummary { get; set; }
public DateTime PublishDate { get; set; }
public Speech(Item item)
{
this.Title = item["Title"];
this.ShortSummary = item["Short Summary"];
this.PublishDate = item["Publish Date"];
}
}
public class NewsLandingViewModel : IRenderingModel
{
public string Title { get; set; }
public string ShortSummary { get; set; }
public List<Article> Articles {get; set;}
public void Initialize(Rendering rendering)
{
var dataSourceItem = rendering.Item;
this.Title = dataSourceItem["Title"];
this.ShortSummary = dataSourceItem["Short Summary"];
foreach (Item child in dataSourceItem.Children)
{
this.Articles.Add(new Article(child));
}
}
}
答案 0 :(得分:2)
如果您创建查看渲染,则Sitecore默认会传递Sitecore.Mvc.Presentation.RenderingModel
类型的模型。
您可以使用PageItem
属性访问该模型上的当前项目,然后访问该项目的Children
。
以下是您的示例视图:
@model Sitecore.Mvc.Presentation.RenderingModel
@string.Format("Current item name = {0}, path = {1}", Model.PageItem.Name, Model.PageItem.Paths.FullPath)
<br />
@foreach (Item child in Model.PageItem.Children)
{
@string.Format("Child name = {0}, path = {1}", child.Name, child.Paths.FullPath)
<br />
}
这将输出名称&amp;当前项目及其所有子项的路径。
发布代码后更新:
更改您的Initialize
方法,使其接受Item
:
public void Initialize(Item dataSource)
{
this.Title = dataSource["Title"];
this.ShortSummary = dataSource["Short Summary"];
foreach (Item child in dataSource.Children)
{
this.Articles.Add(new Article(child));
}
}
然后继续使用View Rendering并使用它来创建强类型模型:
@model Sitecore.Mvc.Presentation.RenderingModel
@{
var PageModel = new NewsLandingViewModel(Model.Item);
}
<h1>@PageModel.Title<h1>
<p>@PageModel.ShortSummary</p>
<ul>
@foreach (Article child in PageModel.Articles)
{
<li>@child.Title</li>
}
</ul>
这是一种做法,但不是很灵活 它也不允许用户使用页面编辑器编辑内容。
您真正想要了解的是Glass Mapper for Sitecore 这是一个将Sitecore模板映射到C#Model类的ORM。
我强烈建议您花一些时间研究玻璃教程,并在解决方案中使用它!