If you don't need the PropertyUrl requirement, you can use a ContentReference instead and use an extension to get the simple url.
using EPiServer; using EPiServer.Core; using EPiServer.DataAnnotations; using EPiServer.ServiceLocation; using EPiServer.Web.Routing; namespace ExampleExtensions { public static class ExampleContentExtensions { static Injected<IContentLoader> _ContentLoader; public static string GetUrl(this ContentReference contentReference) { if (ContentReference.IsNullOrEmpty(contentReference)) return "#"; var content = _ContentLoader.Service.Get<IContent>(contentReference); var externalProperty = content?.Property["PageExternalURL"]; if (!string.IsNullOrWhiteSpace(externalProperty?.ToString())) { return string.Format("/{0}/", externalProperty.ToString().Trim('/')); } return UrlResolver.Current.GetUrl(contentReference); } } public class PageBase : PageData { [CultureSpecific] [AllowedTypes(typeof(PageData))] public virtual ContentReference LinkToContent { get; set; } } }
Thanks Brad,
I was looking for this kind of solution, but it was not working with PropertyUrl...
As I can see here they are using not only the Page references, but links to the catalogs (from EpiCommerce)... and I am not sure if they could reference here on other features of PropertyUrl... So I am looking the solution for PropertyUrl at the moment
I've not tested, but this may work for you. It should support Url, ContentReference, and IContent.
using EPiServer; using EPiServer.Core; using EPiServer.ServiceLocation; using EPiServer.Web.Routing; namespace ExampleExtensions { public static class ExampleContentExtensions { public static string GetUrl(this Url url) { var content = UrlResolver.Current.Route(new UrlBuilder(url)); return GetUrl(content); } public static string GetUrl(this ContentReference contentReference) { if (ContentReference.IsNullOrEmpty(contentReference)) return "#"; var content = ServiceLocator.Current.GetInstance<IContentLoader>().Get<IContent>(contentReference); return GetUrl(content); } public static string GetUrl(this IContent content) { if (content == null) return "#"; var externalProperty = content?.Property["PageExternalURL"]; if (!string.IsNullOrWhiteSpace(externalProperty?.ToString())) { return string.Format("/{0}/", externalProperty.ToString().Trim('/')); } return UrlResolver.Current.GetUrl(content.ContentLink); } } }
Thank you a lot, Brad!
I'll try this solution.
Upd: It works fine. Thanks!
Hi,
I am looking for some elegant solution for it if it exists. Thanks in advance