Визуализация списка ссылок в моем компоненте MVC Sitecore

У меня возникли некоторые трудности с пониманием того, как отображать ссылки в компоненте электронной почты Sitecore EXM.

Я использую рендеринг контроллера Sitecore MVC. По сути, я пытаюсь продублировать компонент Main Section, который поставляется по умолчанию с платформой Sitecore EXM.

Итак, для начала у меня есть контроллер MainSectionMVCController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TestSitecore.Repositories;

namespace TestSitecore.Controllers
{
    public class MainSectionMVCController : Controller
    {
        // GET: MainSectionMVC
        public ActionResult Index()
        {
            var repository = new MainSectionMVCRepository();
            var mainSectionMVC = repository.GetMainSectionMVC();

            var mainSectionMVCViewModel = repository.GetMainSectionMVCViewModel(mainSectionMVC);

            return View(mainSectionMVCViewModel);
        }
    }
}

У меня есть репозиторий MainSectionMVCRepository.cs:

using Sitecore.Links;
using Sitecore.Mvc.Presentation;
using Sitecore.Web.UI.WebControls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TestSitecore.Models;
using TestSitecore.Models.MVCEmailModels;
using Sitecore.Data.Items;
using Sitecore.Collections;

namespace TestSitecore.Repositories
{
    public class MainSectionMVCRepository
    {
        public MainSectionMVC GetMainSectionMVC()
        {
            var mainSectionMVC = new MainSectionMVC();
            var rendering = RenderingContext.Current.Rendering;
            var dataSource = rendering.Item;

            mainSectionMVC.Title = new HtmlString(FieldRenderer.Render(dataSource, Constants.FIELD_TITLE));
            mainSectionMVC.Text = new HtmlString(FieldRenderer.Render(dataSource, Constants.FIELD_TEXT));
            mainSectionMVC.Image = new HtmlString(FieldRenderer.Render(dataSource, Constants.FIELD_IMAGE));

            mainSectionMVC.Links = GetLinks(dataSource);

            return mainSectionMVC;
        }

        private List<Item> GetLinks(Item dataSource)
        {            
            List<Item> links = new List<Item>();

            // I need to get access the the Links that are attached to the datasource item ???? How to do this

            return links;
        }

        public MainSectionMVCViewModel GetMainSectionMVCViewModel(MainSectionMVC mainSectionMVC)
        {
            var viewModel = new MainSectionMVCViewModel();
            var rendering = RenderingContext.Current.Rendering;
            //viewModel.Background = rendering.Parameters["Background"];
            viewModel.ContextItem = PageContext.Current.Item;
            viewModel.MainSectionMVC = mainSectionMVC;

            return viewModel;
        }
    }
}

и модель MainSectionMVC.cs:

using Sitecore.Data.Items;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestSitecore.Models.MVCEmailModels
{
    public class MainSectionMVC
    {
        public HtmlString Title { get; set; }
        public HtmlString Image { get; set; }
        public HtmlString Text { get; set; }

        public List<Item> Links { get; set; }

    }
}

У меня есть ViewModel MainSectionMVCViewModel.cs:

using Sitecore.Data.Items;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestSitecore.Models.MVCEmailModels
{
    public class MainSectionMVCViewModel
    {
        public MainSectionMVC MainSectionMVC { get; set; }
        public string Background { get; set; }
        public Item ContextItem { get; set; }

    }
}

и, наконец, у меня есть Index.cshtml, связанный с действием Index контроллера:

@using Sitecore.Mvc
@using Sitecore.Data.Items
@using Sitecore.Web.UI.WebControls;
@using TestSitecore.Models
@using TestSitecore.Models.MVCEmailModels

@model MainSectionMVCViewModel

<div class="highlight">
    <div class="row">
        <div class="col-md-2 col-lg-2"></div>
        <div class="col-md-5 col-lg-5">
            <h2>@Model.MainSectionMVC.Title</h2>
        </div>
        <div class="col-md-3 col-lg-3" style="align-content: center">
            @Model.MainSectionMVC.Image
        </div>
        <div class="col-md-2 col-lg-2"></div>
    </div>
    <div class="row">
        <div class="col-md-8 col-lg-8">
            <h2>@Model.MainSectionMVC.Text</h2>
        </div>
        <div class="col-md-4 col-lg-4"></div>
    </div>
    <div class="row">
        <!--DISPLAY THE LINKS HERE-->
    </div>
</div>

Моя проблема заключается в том, как заполнить список ссылок в моем репозитории, а затем отобразить вывод в моем компоненте.

Просмотр шаблона из элемента ссылки в Sitecore показывает, что определение данных содержит 2 поля: текст и место назначения.

Поэтому я предполагаю, что текстовое поле используется в качестве отображаемого текста для ссылки, а пункт назначения на самом деле является ItemPath/ItemID.

Я пробовал использовать var children = dataSource.GetChildren(); Это дает мне все дочерние элементы родительского элемента (основной раздел). В настоящее время только ссылки могут быть дочерними элементами элемента основного раздела, но это может измениться, если шаблон компонента будет изменен.

Я изо всех сил пытался найти подходящий способ проверить, являются ли дочерние элементы ссылками. Поэтому любые советы по тестированию типов предметов также будут оценены.

Есть идеи?


person Comic Coder    schedule 09.11.2016    source источник


Ответы (1)


Итак, после множества неправильных поворотов и бед мне наконец удалось найти решение. Думаю, мне не хватало важного понимания вспомогательного класса Sitecore HTML.

Итак, для тех из вас, у кого есть похожая проблема с пониманием, вот как я решил эту проблему.

Внутри моего класса MainSectionMVCRepository я завершаю метод GetLinks() следующим образом:

private List<Item> GetLinks(Item item)
{
    ChildList children = item.GetChildren();
    List<Item> links = new List<Item>(children.Count);

    foreach (Item link in children)
    {
        links.Add(link);
    }

    return links;
}

А затем внутри моего файла Index.cshtml я отображаю ссылки со следующим кодом:

 @{  if (Model.MainSectionMVC.Links.Count > 0)
    {
        <ul>
            @foreach (Item link in @Model.Links)
            {
                <li>
                    @Html.Sitecore().BeginField("Destination", link, new { haschildren = true })
                    @Html.Sitecore().Field("Text", link)
                    @Html.Sitecore().EndField()
                </li>
            }
        </ul>
    }
}

Я очень доволен результатом. Ссылки отображаются и редактируются в редакторе страниц при таком отображении.

Отображение ссылок

Надеюсь, это поможет всем, у кого есть подобные проблемы: D

person Comic Coder    schedule 10.11.2016