naresh Azhagarselvam
Sep 30, 2016
  3646
(2 votes)

IPageCriteriaQueryService - GET THE RELATIVE URL OF A PAGE

GET THE RELATIVE URL OF A PAGE IN EPISERVER USING IPageCriteriaQueryService

Problem Statement

Imagine that we have a scenario where we will need to navigate between EPiServer pages in screens of wizards and one simple way to achieve the navigation is by using the below JavaScript

window.location.href = pageUrl

In this case, we will need to retrieve the relative URL of the EPiServer page so that it can be used in the above JavaScript statement

Solution

 Image Functional_Sequence.png

IPageCriteriaQueryService is an API in EPiServer using which we can search for pages programmatically. We can create Page criteria to search by page name , page id etc. We can create page level criteria using PropertyCriteria class and add those objects to a collection named PropertyCriteriaCollection. The API exposes a method FindPagesWithCriteria which searches for page instances using this PropertyCriteriaCollection object as parameter and the other parameter will be the content reference (page reference) where to start the search. The return type is a PageDataCollection object. We can retrieve the first page object from this collection and retrieve its virtual path using UrlResolver object as shown below.

Code snippet:

            var myPageUrl = GetPageRelativeURL<MyCMSPage>();

            public static string GetPageRelativeURL<PageToSearch>() where PageToSearch : BasePageClass

            {

               string returnurl = "/404";

               try

              {

                var pages = FindPagesWithCriteria<PageToSearch>();

                if (pages != null && pages.Any())

                {

                    returnurl = GetPageUrl(pages.FirstOrDefault());

                }

 

            }

            catch (Exception ex)

            {

                //logging mechanism

            }

            return returnurl;

        }

        private static PageDataCollection FindPagesWithCriteria<PageSearch>() where PageSearch : BasePageClass

        {

            PageDataCollection pages = new PageDataCollection();

            try

            {

                PropertyCriteriaCollection criterias = new PropertyCriteriaCollection();

                PropertyCriteria criteria = new PropertyCriteria();

                criteria.Condition = CompareCondition.Equal;

                criteria.Name = "PageTypeID";

                criteria.Type = PropertyDataType.PageType;

                var contentRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();

                criteria.Value = contentRepository.Load<PageSearch>().ID.ToString();

                criteria.Required = true;

                criterias.Add(criteria);

 

                IPageCriteriaQueryService queryService = ServiceLocator.Current.GetInstance<IPageCriteriaQueryService>();

                pages = queryService.FindPagesWithCriteria(ContentReference.StartPage, criterias);

             }

            catch (Exception ex)

            {

                 //Add your logging mechanism

            }

            return pages;

        }

 

       public static string GetPageUrl(IContent page)

        {

            if(page != null)

            {

               UrlResolver _urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();

 

                return _urlResolver.GetVirtualPath(page).GetUrl() ?? "/";

            }

            else

            {

                return "/";

            }

        }

Sep 30, 2016

Comments

Sep 30, 2016 04:16 PM

Hi,

Instead of using FindPagesWithCriteria, you can use IContentRepository please see http://world.episerver.com/documentation/Class-library/?documentId=cms/9/9018F8D5.

Daniel Ovaska
Daniel Ovaska Sep 30, 2016 04:28 PM

It's also possible to add a few properties to the page/block of type content reference and let editor configure the function. Pro is that you don't need to scan the entire page tree which can affect performance. Con is that you need to set up a few properties the first time you use the function. 

Also noted that the above function will take the first randomly found item of a specific type. That works well if you only have one wizard function but will be problematic if you need to add a second. Your wizard might work well one day and fail the next if editor moves a page or two in the tree structure...

K Khan
K Khan Sep 30, 2016 04:39 PM

Which CMS Versions are you using?

arivoli.elamparithi
arivoli.elamparithi Oct 3, 2016 05:00 PM

Hi Johan,

Any reason why IContentRepository should be used over FindPagesWithCriteria ??

Thanks in advance.

arivoli.elamparithi
arivoli.elamparithi Oct 3, 2016 05:03 PM

Hi Khan,

We are using Episerver version 9.X.

Replying on behalf of Naresh.

Please login to comment.
Latest blogs
Lessons from Building Production-Ready Opal Tools

AI tools are becoming a normal part of modern digital platforms. With  Optimizely Opal , teams can build tools that automate real tasks across the...

Praful Jangid | Mar 7, 2026

My Takeaway from Optimizely Opal Agents in Action 2026 - What Agentic AI Means for the Future of Digital Marketing

I would like to share with you what stayed in my head after this amazing virtual event organized by Optimizely. Agents in Action 2026 , a live...

Augusto Davalos | Mar 6, 2026

From Vision to Velocity: Introducing the Optimizely MVP Technical Roundtable

Digital transformation is a two-sided coin. On one side, you have the high-level strategy, the business cases, the customer journeys, and the...

Patrick Lam | Mar 6, 2026

Commerce 14.45.0 is incompatible with CMS 12.34.2 (but that's an easy fix!)

Incompatible is a strong word, but that is to get your attention. This is one of the small thing that can be overlooked, but if you run into it, it...

Quan Mai | Mar 5, 2026