+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / PageNode.GetFullUrl() returns invalid URL

PageNode.GetFullUrl() returns invalid URL

13 posts, 1 answered
  1. Stephen
    Stephen avatar
    11 posts
    Registered:
    21 Jul 2010
    07 Jul 2011
    Link to this post
    I'm writing a master page. For some reason, the contents of the three strings at the end are invalid: if the URL in my browser is "site.com/home", then the variables contain "~/home". If I adjust the URL in my browser to "site.com/fr/home", then the variables contain "~/fr/home". It seems that regardless of the arguments I try passing to GetFullUrl, it parrots back the path with the application root represented as "~".

    I have tried performing Google and forum searches, but no-one else seems to have this issue. English and French are enabled as public content languages in the Administration area and Multilingual URLs is set to Directories. I'm using Sitefinity 4.1.1501.0.

    using System;
    using System.Globalization;
    using System.Threading;
    using Telerik.Sitefinity.Configuration;
    using Telerik.Sitefinity.Modules.Pages;
    using Telerik.Sitefinity.Modules.Pages.Configuration;
    using Telerik.Sitefinity.Pages.Model;
    using Telerik.Sitefinity.Web;
     
    namespace SitefinityWebApp
    {
        public partial class CLF2 : System.Web.UI.MasterPage
        {
            private CultureInfo fr = CultureInfo.GetCultureInfo("fr"); // French
            private CultureInfo en = CultureInfo.GetCultureInfo("en"); // English
     
            protected void Page_Load(object sender, EventArgs e)
            {
                // Page manager; for getting info about pages
                PageManager manager = PageManager.GetManager();
                 
                // For getting site configuration information
                PagesConfig config = Config.Get<PagesConfig>();
                 
                // Current node; for where we are in the site map
                PageSiteNode currentNode = SiteMapBase.GetActualCurrentNode();
                 
                // Home node; CMS information about the home page
                PageNode homeNode = manager.GetPageNode(config.HomePageId);
                 
                // Page node; CMS information about this page
                PageNode thisNode = manager.GetPageNode(currentNode.Id);
                 
                // Homepage URL
                String enHomeUrl = homeNode.GetFullUrl(en, false);
               String frHomeUrl = homeNode.GetFullUrl(fr, false);
                 
                // URL for alternate language page
                String frUrl = homeNode.GetFullUrl(
                   Thread.CurrentThread.CurrentCulture.Equals(fr) ? fr : en, false);
            }
        }
    }

    Any help would be greatly appreciated, thank you!
  2. Lilia Messechkova
    Lilia Messechkova avatar
    42 posts
    Registered:
    13 Jul 2016
    11 Jul 2011
    Link to this post
    Hello Stephen,

    The method that you need yo use in order to obtain the absolute url is this one: RouteHelper.GetAbsoluteUrl
    Please modifiy the last line of your code as follows and check whether it works.

    String frUrl = RouteHelper.GetAbsoluteUrl(Thread.CurrentThread.CurrentCulture.Equals(fr) ? frHomeUrl : enHomeUrl);

    Please let me know if you have any problems.

    All the best,
    Lilia Messechkova
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  3. Stephen
    Stephen avatar
    11 posts
    Registered:
    21 Jul 2010
    11 Jul 2011
    Link to this post
    RouteHelper.GetAbsoluteUrl() did turn the URL into something usable. But as 

                String enHomeUrl = homeNode.GetFullUrl(en, false);
               String frHomeUrl = homeNode.GetFullUrl(fr, false);

    are identical strings, the result of GetAbsoluteURL() is always the same.

    It is progress, but something else is needed. 

    Does PageNode's PageExtesnsions.GetAbsoluteURL(CulturalInfo, boolean) ignore its parameters? Am I using this method incorrectly?

  4. Lilia Messechkova
    Lilia Messechkova avatar
    42 posts
    Registered:
    13 Jul 2016
    12 Jul 2011
    Link to this post
    Hello Stephen,

    I found a problem in the GetFullUrl method. It uses the culture of the current thread  and the not the one specified as parameter at some places. Here is a work around:

                Thread.CurrentThread.CurrentCulture = en;
                Thread.CurrentThread.CurrentUICulture = en;
                String enHomeUrl = homeNode.GetFullUrl(CultureInfo.CurrentUICulture, true);

                Thread.CurrentThread.CurrentCulture = fr;
                Thread.CurrentThread.CurrentUICulture = fr;
                String frHomeUrl = homeNode.GetFullUrl(CultureInfo.CurrentUICulture, true);

    You need to change the culture of the current thread before obtaining the full url in the culture that you want. In that case enHomeUrl and frHomeUrl should be different and correct relative paths. There is one more specific thing with that method, it returns the url in the default culture if the page is not published, so your code will work for published pages only.

    I really hope that this will solve your problem. If you have further issues please let me know.

    Kind regards,
    Lilia Messechkova
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
    Answered
  5. Stephen
    Stephen avatar
    11 posts
    Registered:
    21 Jul 2010
    12 Jul 2011
    Link to this post
    This workaround... worked. :)

    Hopefully this bug will be resolved soon :)
  6. Scott
    Scott avatar
    3 posts
    Registered:
    05 Nov 2009
    11 Sep 2012
    Link to this post
    This bug is still there in 5.1 SP2.

    This is a moderately severe bug and also seems like it would be easy to fix. Is there any plans to fix it?
  7. Scott
    Scott avatar
    3 posts
    Registered:
    05 Nov 2009
    11 Sep 2012
    Link to this post
    This bug is still there in 5.1 SP2.

    This is a moderately severe bug and also seems like it would be easy to fix. Is there any plans to fix it?
  8. John
    John avatar
    1 posts
    Registered:
    05 Jan 2011
    18 Apr 2013
    Link to this post
    It still exists (version 5.4 4020)! .....
    And with another bug. If you change the current culture you get back the url in this culture except the page. For example:
    for el I get "~/οι-υπηρεσίες-μας/σχετικές-συμβάσεις-έγγραφα"
    for en I get "~/en/our-services/σχετικές-συμβάσεις-έγγραφα"
    "σχετικές-συμβάσεις-έγγραφα" in English is "relative-documents" so I get a page not found...
  9. Stanislav Velikov
    Stanislav Velikov avatar
    1113 posts
    Registered:
    08 Dec 2016
    24 Apr 2013
    Link to this post
    Hi,

    To get the correct language version of the page use the code below:
    //get the correct node for language
                var node = PageHelper.GetPageNodeForLanguage(pm.GetPageNodes().Where(n => n.Title == "syncEN").SingleOrDefault(), currentLanguage);
      
                Thread.CurrentThread.CurrentUICulture = currentLanguage;
                var urlForPage = node.GetFullUrl();
                urlForPage = s.ResolveUrl(urlForPage, currentLanguage);
      
                return urlForPage;


    Regards,
    Stanislav Velikov
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  10. Nick
    Nick avatar
    113 posts
    Registered:
    21 Oct 2008
    19 Jun 2015 in reply to Stanislav Velikov
    Link to this post

    Hi Stanislav,

     

    I was wondering what letter "s" stands for in your sample

    urlForPage = s.ResolveUrl(urlForPage, currentLanguage);

     

    Thanks

  11. Nick
    Nick avatar
    113 posts
    Registered:
    21 Oct 2008
    19 Jun 2015
    Link to this post

    Hi All,

     I am using Sitefinity 7.0 and still having problems

    Just created Germen (de) version of Website on navigation I get page url as www.mywebsite.com/ge/aboutus although when I try to get it programmatically I am always getting www.mywebiste.com/aboutus. Tried 100 different ways (may be only 30 and spent 4 hours)

      

    protected void Page_Load(object sender, EventArgs e)
            {
                var pageNode = SiteMap.RootNode.RootNode;
     
                var site = Telerik.Sitefinity.Services.SystemManager.CurrentContext.CurrentSite;           
                var homePageId = new Guid("E0F18963-472E-627F-855A-FF0000094B1C");// site.HomePageId;
     
                PageManager pageManager = PageManager.GetManager();
                PageData page = pageManager.GetPageDataList().Where(p => p.NavigationNode.Id == homePageId).FirstOrDefault();
                if (page != null)
                {               
                    var page12 = pageManager.GetPageDataList().Where(p => p.NavigationNode.IsBackend == false && p.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live);
                    //var page13 = pageManager.GetPageDataList().Where(p => p.Id == homePageId).SingleOrDefault();
                    //var page14 = pageManager.GetPageDataList().Where(p => p.NavigationNode.PageId == homePageId).SingleOrDefault();
                    var pagecluture = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
                    var page15 = pageManager.GetPageDataList().Where(p => p.NavigationNode.Id == homePageId && p.Culture == pagecluture).FirstOrDefault();
                    if (page15 != null)
                    {
                        var FullURL15 = page15.NavigationNode.GetFullUrl();
                        var url15 = page15.NavigationNode.GetUrl();
                        var url151 = page15.NavigationNode.GetUrl(pagecluture);
                        var fullurl = UrlPath.ResolveUrl(url15, true, true);
                        var fullurl2 = UrlPath.ResolveUrl(url151, true, true);
                        var fullurl21 = RouteHelper.GetAbsoluteUrl(url151);
                        var NavNode = page15.NavigationNode;
     
                        var pageurlis = GetUrlByPageNodeIdAlternative(homePageId, pagecluture, true);
                        var pageurlis2 = GetUrlByPageNodeIdAlternative(homePageId, pagecluture, false);
                    }
     
     
                }
            }
     
     
    private string GetUrlByPageNodeIdAlternative(Guid pageNodeId, string targetCulture, bool resolveAsAbsolutUrl)
            {
                var siteMap = SiteMapBase.GetCurrentProvider();
     
                // Get the siteMapNode
                var siteMapNode = siteMap.FindSiteMapNodeFromKey(pageNodeId.ToString()) as PageSiteNode;
                var culture = System.Globalization.CultureInfo.GetCultureInfo(targetCulture);
                var url = String.Empty;
                if (siteMapNode != null)
                {
                    // Get the URL of the siteMapNode
                    url = siteMapNode.GetUrl(culture, false);
                    if (resolveAsAbsolutUrl)
                    {
                        // Get the absolute URL of the pageNode
                        url = UrlPath.ResolveUrl(url, true, true);
                    }
                }
                return url;
            }

     

    With regards

     

     

     

  12. Stanislav Velikov
    Stanislav Velikov avatar
    1113 posts
    Registered:
    08 Dec 2016
    22 Jun 2015
    Link to this post
    Hi,

    The way to resolve the correct language specific Url is below. It uses UrlLocalizationService to resolve the current culture prefix for each url.

    I have provided several approaches to the achieve this.
    var currentLanguage = Thread.CurrentThread.CurrentUICulture;
               var pageUrl = SiteMapBase.GetActualCurrentNode().Id;
      
      
               //CultureInfo currentLanguage = new CultureInfo("en");
               Thread.CurrentThread.CurrentUICulture = currentLanguage;
               PageManager pm = PageManager.GetManager();
               UrlLocalizationService s = ObjectFactory.Resolve<UrlLocalizationService>();
               var pageNode = pm.GetPageNodes().Where(n => n.Id == pageUrl).FirstOrDefault();
      
               // approach 1
               var node = PageHelper.GetPageNodeForLanguage(pageNode, currentLanguage);
               var urlForPage = node.GetFullUrl();
               //the correct url gets returned here.
               urlForPage = s.ResolveUrl(urlForPage, currentLanguage);
      
               //approach2
               var approach3Url = pageNode.GetFullUrl(currentLanguage, false);
      
               //approach3
               var approach4Url = Page.ResolveUrl(approach3Url);
      
               //approach4
      
               var approach5Url = ObjectFactory.Resolve<UrlLocalizationService>().ResolveUrl(approach3Url);
      
               //approach5
               //double resolving url occurs here also
               var approach6Url = ObjectFactory.Resolve<UrlLocalizationService>()
                   .ResolveUrl(PageHelper.GetPageNodeForLanguage(pageNode, currentLanguage)
                   .GetFullUrl(currentLanguage, false), currentLanguage);



    Regards,
    Stanislav Velikov
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
  13. Ben
    Ben avatar
    44 posts
    Registered:
    27 Sep 2012
    04 May in reply to Stanislav Velikov
    Link to this post

    Can you put this in the localization documentation? 

    http://docs.sitefinity.com/for-developers-localize-pages-and-content

13 posts, 1 answered