Kevin Brechbühl
Kevin Brechbühl

Reputation: 4717

Get absolute Url for internal Links with Glass Mapper for Sitecore

My item template has a field for a General Link and is representing by the following class:

[SitecoreType]
public class MenuLink
{
    [SitecoreField(FieldName = "Link")]
    public virtual Link Link { get; set; }
}

Now my link field contains external and internal links (links pointing to other items). Is it possible to configure Glass Mapper that the Url Property of the Link contains the absolute url (like AlwaysIncludeServerUrl=true)? And also that is used the site resolving (SiteResolving=true)?

Basically I would like to give the Link property an UrlOptions configuration.

I'm using Sitecore 7.1 with Glass.Mapper.Sc 3.1.2.18.

Upvotes: 5

Views: 11567

Answers (3)

Ahmed Okour
Ahmed Okour

Reputation: 2422

Have you tried replacing SitecoreField attribute with:

[Glass.Mapper.Sc.Configuration.Attributes.SitecoreInfo(Type=Glass.Mapper.Sc.Configuration.SitecoreInfoType.Url,UrlOptions= Glass.Mapper.Sc.Configuration.SitecoreInfoUrlOptions.AlwaysIncludeServerUrl)]

I have not tried this yet, but worth trying.

Update : This method is not working correctly, please refer to Michael solution.

Upvotes: 4

Michael Edwards
Michael Edwards

Reputation: 6528

Kevin

Please download release 3.1.6 I have added the UrlOptions property to the SitecoreFieldAttribute class. You should be able for force the server path like so:

[SitecoreField(UrlOptions=SitecoreInfoUrlOptions.AlwaysIncludeServerUrl)]
public virtual Link MyLink{get;set;}

You can also added other options by piping the flags:

[SitecoreField(UrlOptions=SitecoreInfoUrlOptions.AlwaysIncludeServerUrl|SitecoreInfoUrlOptions.LanguageEmbeddingNever)]
public virtual Link MyLink{get;set;}

Upvotes: 7

Ruud van Falier
Ruud van Falier

Reputation: 8877

Add this extension method to your solution:

using Sitecore;
using Sitecore.Links;
using Glass.Mapper.Sc.Fields;

public static class LinkExtensions
{
    public static string GetLinkUrl(this Link link, ISitecoreContext sitecoreContext = null)
    {
        if (link != null)
        {
            if (link.Type == LinkType.External || link.Type == LinkType.Media)
            {
                return link.Url;
            }
            else if (link.Type == LinkType.Internal)
            {
                var target = (sitecoreContext ?? new SitecoreContext()).Database.GetItem(new ID(link.TargetId));

                var urlOptions = Sitecore.Links.UrlOptions.DefaultOptions;
                urlOptions.AlwaysIncludeServerUrl = true;
                urlOptions.SiteResolving = true;

                return LinkManager.GetItemUrl(target, urlOptions);
            }
        }

        return string.Empty;
    }
}

Then, assuming you have this model:

[SitecoreType]
public class MenuLink
{
    [SitecoreField(FieldName = "Link")]
    public virtual Link Link { get; set; }
}

You can get the URL like this:

model.Link.GetLinkUrl();

Upvotes: 4

Related Questions