我想在Umbraco中获取节点的URL。
我想从网络服务调用的自定义类执行此操作,以自动发送包含每个节点 URL 的电子邮件。
通常我使用这种方法
using umbraco.NodeFactory;
...
Node node = new Node(1234);
string link = node.Url;
但这会返回一个错误,指出对 umbracoContext 的引用不能为空。
据我从网络上了解,这是因为 cron 作业正在调用此服务,那么 umbracoContext 为空。
我需要一种方法来获取节点的 url,方法是给节点 Id。
我已经尝试了所有这些方法,它们都返回相同的错误:
string url = umbraco.library.NiceUrl(1234);
var umbracoHelper = new UmbracoHelper(Umbraco.Web.UmbracoContext);
string url = umbracoHelper.Url(1234);
var objectNode = umbracoHelper.TypedMedia(1234);
string url = objectNode.Url;
有什么建议吗?
首先,你不应该在 V7 中使用 Node API,它非常古老并且已被弃用。umbraco.library也一样!
执行此操作的一种简单方法是在 Umbraco 站点上创建一个 WebAPI 控制器终结点,该终结点获取站点上每个页面的 URL,并将它们作为 URL 数组返回。如果您希望使其安全,您可以向其添加身份验证等。WebAPI 控制器的文档可以在下面找到:
https://our.umbraco.com/documentation/reference/routing/webapi/
您的 WebAPI 控制器将具有完整的 UmbracoContext 可用并可以访问 Umbraco 帮助程序,因此您可以大致拥有如下所示的内容:
public class AlertController : UmbracoApiController
{
public List<string> GetAllUrls()
{
var list = new List<string>();
var allContent = Umbraco.TypedContentAtRoot().FirstOrDefault().DescendantsOrSelf();
foreach (var page in allContent)
{
list.Add(page.Url);
}
return list;
}
}
您可能想要执行一些操作,例如过滤掉不需要的内容,或者不需要列出的内容(例如设置节点(。
然后,您的其他服务可以调用 webAPI 终结点并使用 URL 列表并使用它来发送电子邮件。