У меня возникли некоторые трудности с пониманием того, как отображать ссылки в компоненте электронной почты 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();
Это дает мне все дочерние элементы родительского элемента (основной раздел). В настоящее время только ссылки могут быть дочерними элементами элемента основного раздела, но это может измениться, если шаблон компонента будет изменен.
Я изо всех сил пытался найти подходящий способ проверить, являются ли дочерние элементы ссылками. Поэтому любые советы по тестированию типов предметов также будут оценены.
Есть идеи?