在我的组件 MVC Sitecore 中呈现链接列表
Render a list of links in my Component MVC Sitecore
我在理解如何在 Sitecore EXM 电子邮件组件中显示 link 时遇到一些困难。
我正在使用 Sitecore MVC 控制器渲染。我实际上是在尝试复制 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 linked 到控制器的索引操作:
@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>
我的问题是如何在我的存储库中填充 link 的列表,然后在我的组件上呈现输出。
从 Sitecore 中的 Link 项目查看模板显示数据定义包含 2 个字段,文本和目标。
所以我假设文本字段用作 link 的显示文本,目标实际上是 ItemPath/ItemID。
我试过使用 var children = dataSource.GetChildren();
这让我得到父项(主要部分)的所有子项。目前只有 Links 可以是 Main Section Item 的子项,但如果修改组件模板,这可能会改变。
我努力寻找一种合适的方法来测试子项目是否是 Links。因此,任何有关测试项目类型的提示也将不胜感激。
有什么想法吗?
所以在经历了很多错误的转折和困境之后,我终于找到了解决办法。
我想我缺少对 Sitecore HTML 助手 class.
的一些重要理解
对于那些遇到类似问题的人来说,这里是我解决问题的方法。
在我的 MainSectionMVCRepository class 中,我完成了 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
我在理解如何在 Sitecore EXM 电子邮件组件中显示 link 时遇到一些困难。
我正在使用 Sitecore MVC 控制器渲染。我实际上是在尝试复制 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 linked 到控制器的索引操作:
@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>
我的问题是如何在我的存储库中填充 link 的列表,然后在我的组件上呈现输出。
从 Sitecore 中的 Link 项目查看模板显示数据定义包含 2 个字段,文本和目标。
所以我假设文本字段用作 link 的显示文本,目标实际上是 ItemPath/ItemID。
我试过使用 var children = dataSource.GetChildren();
这让我得到父项(主要部分)的所有子项。目前只有 Links 可以是 Main Section Item 的子项,但如果修改组件模板,这可能会改变。
我努力寻找一种合适的方法来测试子项目是否是 Links。因此,任何有关测试项目类型的提示也将不胜感激。
有什么想法吗?
所以在经历了很多错误的转折和困境之后,我终于找到了解决办法。 我想我缺少对 Sitecore HTML 助手 class.
的一些重要理解对于那些遇到类似问题的人来说,这里是我解决问题的方法。
在我的 MainSectionMVCRepository class 中,我完成了 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