C# 基于对外部文档存储的查找设置umbraco节点名称

C# 基于对外部文档存储的查找设置umbraco节点名称,c#,.net,umbraco,umbraco7,C#,.net,Umbraco,Umbraco7,我正在尝试复制Umbraco(Umbraco v7)的过程,即当存在同名的现有节点时,更新节点名称 但在本例中,我正在构建一个归档过程,它将节点从Umbraco数据库复制到一个归档数据库中。我面临的问题是试图使URL唯一,因为我需要对我的存档进行查找,以确保节点名称唯一 当前,我在触发Umbraco save事件时触发了一个自定义保存方法,该事件根据存档查找名称并检查URL是否唯一 protected override void ApplicationStarting(UmbracoAp

我正在尝试复制Umbraco(Umbraco v7)的过程,即当存在同名的现有节点时,更新节点名称

但在本例中,我正在构建一个归档过程,它将节点从Umbraco数据库复制到一个归档数据库中。我面临的问题是试图使URL唯一,因为我需要对我的存档进行查找,以确保节点名称唯一

当前,我在触发Umbraco save事件时触发了一个自定义保存方法,该事件根据存档查找名称并检查URL是否唯一

    protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        ContentService.Saving += ContentService_Saving;
    }

    void ContentService_Saving(IContentService sender, Umbraco.Core.Events.SaveEventArgs<IContent> e)
    {

        // create the content global ID
        foreach (var entity in e.SavedEntities)
        {
            var url = Helper.GetNiceUrlPath(entity);
            // fetch all items from the database with that name + url
            var result = AppArchiver.GetContentByUrl(Helper.CreateUrlFromName(entity.Name)).ToList();                

            if(result.Any())
            {
                // do something here with the name if possible?
            }

            if (!entity.HasAppId())
            {
                entity.SetAppId();
            }
        }
    }
protected override void应用程序启动(umbraco应用程序基础umbraco应用程序,ApplicationContext ApplicationContext)
{
ContentService.Saving+=ContentService\u Saving;
}
无效内容服务\u保存(IContentService发送方,Umbraco.Core.Events.SaveEventArgs e)
{
//创建内容全局ID
foreach(e.SavedEntities中的var实体)
{
var url=Helper.GetNiceUrlPath(实体);
//从数据库中获取具有该名称+url的所有项目
var result=appachiver.GetContentByUrl(Helper.CreateUrlFromName(entity.Name)).ToList();
if(result.Any())
{
//如果可能的话,在这里用这个名字做点什么?
}
如果(!entity.HasAppId())
{
entity.SetAppId();
}
}
}
我无法将名称设置为其只读属性。。。我无法使用
entity.SetValue(“name”,“blah(1)”)设置它。

那么我最好的选择是什么呢?有什么建议吗?因为我的头撞在墙上,在翁布拉科的源代码中搜索,试图找出他们是如何做到这一点的

将这些节点存储在数据库中的原因是,每月将创建大约300个新节点,在Umbraco中导航这些节点是无法忍受的

更新:
好的,看起来在将项目发回后端保存之前,Umbraco会在角度代码中执行URL唯一性检查。如果可能的话,我必须创建一个这样做的服务。

我可能误解了这个问题,但是与其尝试复制流程,为什么不使用Umbraco已经创建的唯一url呢

我在我们的Umbraco安装中设置了类似的设置,触发Document.BeforeSave事件。 如果我尝试运行以下代码:

private void Document_BeforeSave(Document sender, global::umbraco.cms.businesslogic.PublishEventArgs e)
{
    var url = umbraco.library.NiceUrl(sender.Id);
}

然后,url已经是唯一的,因为Umbraco已确保在保存节点之前重命名该节点。

确定,因此似乎无法通过Umbraco的后端执行此操作。 我必须在umbraco前端代码中写入一个钩子,该代码通过服务查找我的归档文件,并返回url/名称是否唯一

查看http post umbraco在保存/发布文档时所做的操作,该文档已经在节点名称后面附加了唯一标识符(即(1))


如果/当我开始写这个过程时,我会更新这个问题。

您好,谢谢您的回复-不同之处在于文档是从CMS归档的,但仍然需要一个唯一的url。所以我有一个层,它从存档中读取并检查url是否唯一。因此,由于存档的节点不再位于CMS中,umbraco的服务将不知道url是否唯一。啊,好吧,我没有意识到你不是通过CMSi创建节点,而是通过CMS创建节点。。但是,例如,每周一次,当内容和xml结构存储在数据库中时,它们会从umbraco节点归档(因此基本上被删除)。我会在需要的时候把它映射回用户界面。对,是的,我知道为什么会有问题。期待看到您提出的解决方案:)