Manoj Kumawat
Jan 3, 2020
  9328
(0 votes)

Using simple address in URL

In this blog post I'll demostrate how you can utilize episerver's Simple address in URL with an Initialization module.

The simple address can be used as a direct address/Route node without language node included in URL.

See Below - 

This is an external URL which you can utilize for promotional contents as News Events, Press Releases etc. 

Let's create an initialization module that will parse the URL after a virtual path is created.

Step 1 - Define and initialize services to use

private bool initialized = false;
private IContentLoader contentLoader;
private IContentRouteEvents contentRouteEvents;

public void Initialize(InitializationEngine context)
{
	if (!initialized)
	{
		contentLoader = context.Locate.Advanced.GetInstance<IContentLoader>();
		contentRouteEvents = context.Locate.Advanced.GetInstance<IContentRouteEvents>();
		contentRouteEvents.CreatedVirtualPath += ContentRouteEvents_CreatedVirtualPath;
		initialized = true;
	}
}

Above,

The contentLoader would be used to cast the URL to a Page type.

The contentRouteEvents would keep tracks of URLs (virtual paths) being created. Note, that the delegate method ContentRouteEvents_CreatedVirtualPath will only be raised when outgoing virtual path has been created.

The property initialized will initialize the Module only once and it makes sure that it should not be initialized more than once. 

This Event handler will be explained in next step. 

Step 2 - Managing route via Route Event Handler

In previous step we've defined a delegate method that should be raised when the path is created. Now let's take a look how you can use the URL/Path to cast in a page and utilize it's simple address.

private void ContentRouteEvents_CreatedVirtualPath(object sender, UrlBuilderEventArgs e)
{
	var contentLink = e.RouteValues[RoutingConstants.NodeKey] as ContentReference;
	if (!ContentReference.IsNullOrEmpty(contentLink))
	{
		var lang = e.RouteValues[RoutingConstants.LanguageKey] as string;
		var langSelector = string.IsNullOrEmpty(lang) ? LanguageSelector.AutoDetect() : new LanguageSelector(lang);
		var page = contentLoader.Get<IContent>(contentLink, langSelector) as PageData;
		if (page != null && !string.IsNullOrEmpty(page.ExternalURL))
		{
			e.UrlBuilder.Path = page.ExternalURL;
		}
	}
}

Above, 

Read the RouteValues, i.e. language and node name. For instance http://localhost:52426/en/alloy-track <-- language is 'en' and node is 'alloy-track'

Cast the URL as page Data <-- var page = contentLoader.Get<IContent>(contentLink, langSelector) as PageData

Finally, If the Simple address field is not blank then use the external URL instead of default route URL.

Verifying

When you have the external/Simple Address defined in Episerver then the external URL would be used as the link address of that item. See Below 

Cheers!

Jan 03, 2020

Comments

Ben Nitti
Ben Nitti Jul 6, 2020 10:00 PM

Exactly what I was looking to do, thanks!

Please login to comment.
Latest blogs
Commerce 15 and CMS 13: Optimizely’s Next Step Toward AI-Powered, Graph-First Commerce

Optimizely is preparing to release Commerce 15 in mid-May 2026 , positioning this as a foundational shift—not just an upgrade. The direction is...

Augusto Davalos | May 7, 2026

The future of Content: Introducing Optimizely CMS 13

Optimizely In the rapidly evolving landscape of digital experience, the "monolithic vs. headless" debate is being replaced by a more sophisticated...

Aniket | May 6, 2026

Hide built in scheduled job from the admin UI

Ok so this probably goes into the not so useful section but late last night I got a veery strong feeling that all projects I am  involved with have...

Per Nergård (MVP) | May 6, 2026

Optimizely SaaS CMS Developer Certification Exam

The Optimizely SaaS CMS Developer Certification is an industry-recognized credential for developers and architects who build scalable, composable...

Megha Rathore | May 5, 2026

Piwik PRO Connector for Optimizely CMS — Now on NuGet (and Yes, It Speaks Both 12 and 13)

Analytics has spent the last decade living in another tab — and what's in that tab usually isn't the full story. Between consent requirements,...

Allan Thraen | May 4, 2026 |

A First Look at Optimizely Remote MCP Server for Experimentation

Optimizely just released a Remote MCP Server for Experimentation and I've been trying it out to see what it can do. If you don't know, MCP (Model...

Jacob Pretorius | May 1, 2026