Deane Barker
Sep 3, 2010
  5932
(2 votes)

Correcting All Raw URLs Inside a String of HTML

If you create a link inside an EPiServer page to another EPiServer page, the link that gets embedded in the HTML is not friendly.  It looks something like this:

/Templates/PageTypes/TextPage.aspx?id=66

EPiServer corrects these links very late in the page lifecycle – actually in a response filter after the entire page has been generated.  This way, it’s sure to correct links no matter where on the page they might be.

What I noticed, however, is that these links were only getting corrected for Web forms.  More specifically, they were only getting corrected for anything with a “text/html” content type.

This was usually fine because I could change the response type, but sometimes it was an issue, especially when doing Ajax callbacks.  You often send those back as some plain text format like JSON, and you form the response at the code level, concatening the raw values of properties into a string.  Before long, you notice that your links aren’t corrected in blocks of HTML.

It’s not hard to get the friendly URL from a PageData object:

UrlBuilder url = new UrlBuilder(pd.LinkURL);
UrlRewriteProvider.ConvertToExternal(url, somePageData.PageLink, UTF8Encoding.UTF8);
string theFriendlyURl = url.ToString();

This is great to go from a PageData object to a friendly URL.  What I found to be much tricker, however, was if I had a big string of HTML with a bunch of embedded links and I needed to correct them all before working with the string.

When I was in Sweden for the Partner Summit, I posed this question to Magnus Stråle.  I was awfully grateful when he took the time to dig through EPiServer’s unit tests to find a chunk of code for me.  It’s distilled down to this function:

private string CorrectLinks(string rawHtml)
{
    var toExternal = new FriendlyHtmlRewriteToExternal(UrlBuilder.RebaseKind.ToRootRelative);
    return toExternal.RewriteString(
        new UrlBuilder(HttpContext.Current.Request.Path),
        new UrlBuilder(HttpContext.Current.Request.RawUrl),
        HttpContext.Current.Response.ContentEncoding,
        rawHtml);
}

This will take a string of HTML, correct all the links inside of it, and return another string, ready for insertion into any response, be it text, JSON, or whatever.

Thanks to Magnus for taking the time to help me solve this.

Sep 03, 2010

Comments

Mari Jørgensen
Mari Jørgensen Sep 21, 2010 10:33 AM

Nice one!

Sep 21, 2010 10:33 AM

Nice. :)

Alex Judd
Alex Judd Jan 31, 2011 07:49 PM

Interestingly this caused absolute chaos in a situation where we _did_ want to pass parameters using the URL string (GET parameters) as the page renderer tried to read our ?parameter=value set as well and use it as a page ID.

To get around this [trial and error found this out], add your own parameters with the ¶meter=value as the pageID will be by default the first parameter and want to use the ?parameter=value tag, and then EPiServer converts this to a ?parameter=tag automatically once it has tidied up the URLs in the page.

Very clever when you know how!

Please login to comment.
Latest blogs
Opti ID overview

Opti ID allows you to log in once and switch between Optimizely products using Okta, Entra ID, or a local account. You can also manage all your use...

K Khan | Jul 26, 2024

Getting Started with Optimizely SaaS using Next.js Starter App - Extend a component - Part 3

This is the final part of our Optimizely SaaS CMS proof-of-concept (POC) blog series. In this post, we'll dive into extending a component within th...

Raghavendra Murthy | Jul 23, 2024 | Syndicated blog

Optimizely Graph – Faceting with Geta Categories

Overview As Optimizely Graph (and Content Cloud SaaS) makes its global debut, it is known that there are going to be some bugs and quirks. One of t...

Eric Markson | Jul 22, 2024 | Syndicated blog

Integration Bynder (DAM) with Optimizely

Bynder is a comprehensive digital asset management (DAM) platform that enables businesses to efficiently manage, store, organize, and share their...

Sanjay Kumar | Jul 22, 2024

Frontend Hosting for SaaS CMS Solutions

Introduction Now that CMS SaaS Core has gone into general availability, it is a good time to start discussing where to host the head. SaaS Core is...

Minesh Shah (Netcel) | Jul 20, 2024

Optimizely London Dev Meetup 11th July 2024

On 11th July 2024 in London Niteco and Netcel along with Optimizely ran the London Developer meetup. There was an great agenda of talks that we put...

Scott Reed | Jul 19, 2024