2

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

我可以得到具有如下 ID 的节点路径:“-1,1067,1080”,但不知道如何将其转换为 url 格式。

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

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

Node someNode = new Node(nodeId);

当我尝试获取 NiceUrl 时:

string url = someNode.NiceUrl;

获取 ArgumentNullException。

我检查了它的原因:发现下一个答案NiceUrl使用 UmbracoContext 所以这是不可能的,因为它是空的。

我也不能使用这个:UmbracoContext.Current.ContentCache.GetById(someidhere).Url

谢谢。

4

2 回答 2

3

如果没有 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();
    }     
}
于 2015-04-08T09:00:39.707 回答
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

于 2013-10-08T08:44:50.720 回答