一把umbraco。在控制台应用程序中获取节点的URL

时间:2013-10-03 15:33:55

标签: c# console umbraco

我在控制台应用程序中使用Umbraco。 当我尝试为某个节点获取NiceUrl时,这是不可能的,因为UmbracoContext.Current为空。

我可以使用这样的ID获取节点路径:" -1,1067,1080",但不知道如何以url格式转换它。

如何在控制台应用程序中获取Node的NiceUrl

我接下来做了:  在我的控制台应用程序中,我通过Id获取节点,简单如下:

Node someNode = new Node(nodeId);

当我尝试获取NiceUrl时:

string url = someNode.NiceUrl;

获取ArgumentNullException。

我检查了原因:找到下一个答案NiceUrl使用UmbracoContext,因此它不可能,因为它为空。

此外,我无法使用此功能:UmbracoContext.Current.ContentCache.GetById(someidhere).Url

感谢。

2 个答案:

答案 0 :(得分:2)

如果没有UmbracoContext,我不认为在V6中可以获取IContent节点的URL。

我浏览了Umbraco源代码并决定重新创建它在那里完成的方式。我想出了这个,这符合我的需要。

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();
    }     
}

答案 1 :(得分:0)

是的,你不能使用:UmbracoContext.Current.ContentCache因为这是访问相同的上下文。

看起来您使用的是v6 +,因此您需要使用Umbraco提供的API服务,特别是ContentService。

这里有一个线索可以查看您要问的相同内容:http://our.umbraco.org/forum/developers/api-questions/37981-Using-v6-API-ContentService-in-external-application

这里有一个解决方案示例:https://github.com/sitereactor/umbraco-console-example