SharePoint automaticky překládá všechny odkazy dle aktuální zjištěné URL zóny z HttpRequestu, je jedno zda máte odkazy přímo ve webpart stránce, ve sloupci typu Hypertextový odkaz, případně přímo v richtextu, SharePoint se vždy při renderingu podívá, zda odkaz není definován v AAM a pokud ano, automaticky ho přeloží na tvar přístupný aktuálně přihlášenému uživateli. Je to funkce logická a žádaná, neboť je jedno, zda vložíte do textu odkaz z intranetové či extranetové zóny (url adresy SP portálu), všichni uživatelé budou mít odkazovaný obsah dostupný vždy.
Stejné chování je potřeba přenést i do vlastně vyvinutých funkcí, webpart, aplikačních stránek – protože tam to SharePoint sám o sobě neumí. Převod je sám o sobě velice jednoduchý, základem je objekt SPSite, který je ale nutné buď převzít z kontextu SPContext.Current.Site nebo ho inicializovat pomocí aktuální Url adresy HttpRequestu – tedy tak, aby došlo k inicializaci objektu SPSite ve správné zóně (SPUrlZone), nelze tedy tento objekt inicializovat pomocí GUID, kde se informace o zóně ztratí.
Pro překlad odkazu mám triviální rozšíření objektu SPSite:
public static string TranslateUrlByAAM(this SPSite site, string url) { if (site == null) throw new ArgumentNullException("site"); if (string.IsNullOrEmpty(url)) return url; Uri originalUri = new Uri(url); Uri translateUri = SPFarm.Local.AlternateUrlCollections .RebaseUriWithAlternateUri(originalUri, site.Zone); if (translateUri == null) return url; return translateUri.ToString(); }
Analogicky regex pro replace url odkazů v html textu.