Sitecore MVC +儿童

时间:2014-04-09 16:11:49

标签: sitecore sitecore7 sitecore-mvc

如何使用模型获取当前页面的子项列表?

我尝试为登录页面创建一个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));
        }
    }
}

1 个答案:

答案 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。

我强烈建议您花一些时间研究玻璃教程,并在解决方案中使用它!