EPiServer Link Collection Property
Posted on May 18, 2009 by Frederik Vig in ASP.NET, C#, Code Snippet, EPiServerThe EPiServer Link Collection 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); |
S.K. SreeRaghavendra says:
Post Author August 10, 2010 at 16:34Hi Fredrik,
I have one query regarding the GUID of LinkItems. In case the LinkItem is related to Page within the Website then it has a distinct GUID. But if the LinkItem is an external URl how to capture the disinctness of the external Url . Is there any way to get a GUID which is related to that Linkitem(external URL)?
Regards,
S.K. SreeRaghavendra
Madhu says:
Post Author March 31, 2011 at 10:03Hi Fredrik,
How to add documents,internal links and external links in one LinkCollection?
Regards
Madhu