Taras Pelenio
Taras Pelenio

Reputation: 73

Umbraco. Get node's url in console application

I work with Umbraco from Console application. When I try get NiceUrl for some node it is impossible because UmbracoContext.Current is null.

I can get node path with ids like this: "-1,1067,1080", but don't know how convert it in url format.

How Can I get NiceUrl for Node in console application?

I did next: In my console application I get node by Id, simple like this:

Node someNode = new Node(nodeId);

When I try get NiceUrl:

string url = someNode.NiceUrl;

get ArgumentNullException.

I checked why it: found next answer NiceUrl uses UmbracoContext so it is not possible because it's null.

Also I can't use this: UmbracoContext.Current.ContentCache.GetById(someidhere).Url

Thanks.

Upvotes: 2

Views: 4767

Answers (2)

PeteG
PeteG

Reputation: 563

Without the UmbracoContext I don't think it's possible in V6 to get the URL of an IContent node.

I looked through the Umbraco source code and decided to recreate the way it's done there. I came up with this, which worked for my needs.

https://gist.github.com/petergledhill/ca2a3a0ea81b06abcb08

public static class ContentExtensions
{                
    public static string RelativeUrl(this IContent content)
    {
        var pathParts = new List<string>();
        var n = content;

        while (n != null)
        {
            pathParts.Add(n.UrlName());
            n = n.Parent();                
        }
        pathParts.RemoveAt(pathParts.Count() - 1); //remove root node
        pathParts.Reverse();
        var path = "/" + string.Join("/", pathParts);
        return path;
    }    

    public static string UrlName(this IContent content)
    {
        return new DefaultUrlSegmentProvider().GetUrlSegment(content).ToLower();
    }     
}

Upvotes: 3

Digbyswift
Digbyswift

Reputation: 10400

Yes, you can't use: UmbracoContext.Current.ContentCache because this is accessing the same context.

It looks like you are using v6+, so instead you will need to use the API services that Umbraco provide, specifically the ContentService.

There is a thread here that looks into the same thing you are asking: http://our.umbraco.org/forum/developers/api-questions/37981-Using-v6-API-ContentService-in-external-application

And an example of a solution here: https://github.com/sitereactor/umbraco-console-example

Upvotes: 0

Related Questions