EPiServer Link Collection Property
In EPiServer CMS 5 R2, EPiServer added a new property called the link collection. This property allows you to add links to web pages, documents and e-mail addresses. For a nice overview see this post: EPiServer 5 R2 and Link Collection property
In this example I’m going to show you how to use the link collection property to get a page reference to EPiServer pages and retrieve some content from them. This could be used for a related content sidebar or something similar.
Start by creating a new link collection property in admin mode to an existing page type or a new one, name it RelatedContent. Then go to edit mode and add a few links to various pages.
Now we’ll start on the page template, open up your web form and add this markup.
<asp:Repeater runat="server" ID="rptRelatedContent" OnItemDataBound="rptRelatedContent_ItemDataBound"> <HeaderTemplate> <ul id="relatedContent"> </HeaderTemplate> <ItemTemplate> <li> <h3><asp:HyperLink runat="server" ID="lnkHeading" /></h3> <p><asp:Literal runat="server" ID="ltlText" /></p> </li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater>
Then in your code-behind.
protected void Page_Load(object sender, EventArgs e) { if (IsValue("RelatedContent")) { // using EPiServer.SpecializedProperties; var relatedContent = (LinkItemCollection)CurrentPage["RelatedContent"]; if (relatedContent != null) { rptRelatedContent.DataSource = relatedContent; rptRelatedContent.DataBind(); } } }
protected void rptRelatedContent_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { var linkItem = (LinkItem)e.Item.DataItem; var lnkHeading = (HyperLink)e.Item.FindControl("lnkHeading"); var ltlText = (Literal)e.Item.FindControl("ltlText"); if (linkItem != null && lnkHeading != null && ltlText != null) { var url = new UrlBuilder(linkItem.Href); // using EPiServer.Web; bool isEPiServerPage = PermanentLinkMapStore.ToMapped(url); if (isEPiServerPage) { var page = DataFactory.Instance.GetPage(PermanentLinkUtility.GetPageReference(url)); if (page != null) { lnkHeading.Text = page["Heading"] as string ?? page.PageName; lnkHeading.NavigateUrl = page.LinkURL; ltlText.Text = GetText(page, 255); } } } } }
The GetText method I usually place in a static helper class. It is just to get 255 characters of text from the pages MainIntro property or if it is empty from the MainBody property:
public static string GetText(PageData page, int textLength) { if (page == null) { return string.Empty; } var text = page["MainIntro"] as string; if (string.IsNullOrEmpty(text)) { text = page["MainBody"] as string; } if (string.IsNullOrEmpty(text)) { return string.Empty; } // using EPiServer.Core.Html; return TextIndexer.StripHtml(text, textLength); }
You could also add it as an extension method:
// Simply add the this keyword in front of PageData public static string GetText(this PageData page, int textLength) { ... }
Then you can call it like this instead:
ltlText.Text = page.GetText(255);