Orchardcms Orchard Contrib.分类法-删除草稿时永久链接冲突

Orchardcms Orchard Contrib.分类法-删除草稿时永久链接冲突,orchardcms,Orchardcms,使用Orchard中的Contrib分类法预览和拒绝草稿: 我需要在导入后预览(如有必要,拒绝)分类术语 我已尝试使用以下代码执行此操作: A.我已将标准进口代码的最后一行更改为: Services.ContentManager.Create(term, VersionOptions.Draft); (而不是VersionOptions.Published) B.我的预览屏幕有一个“发布”按钮,控制器操作代码如下: // remove current published terms fore

使用Orchard中的Contrib分类法预览和拒绝草稿:

我需要在导入后预览(如有必要,拒绝)分类术语

我已尝试使用以下代码执行此操作:

A.我已将标准进口代码的最后一行更改为:

Services.ContentManager.Create(term, VersionOptions.Draft); 
(而不是VersionOptions.Published)

B.我的预览屏幕有一个“发布”按钮,控制器操作代码如下:

// remove current published terms
foreach (var term in _taxonomyService.GetTerms(taxonomyId)) {
    _taxonomyService.DeleteTerm(term);
}

// publish draft terms created at import
foreach (var draftTerm in _MyTaxonomyService.GetDraftTerms(taxonomyId)) {
    Services.ContentManager.Publish(draftTerm.As<ContentItem>());
}
// delete drafts
foreach (var draftTerm in _MyTaxonomyService.GetDraftTerms(taxonomyId)) {
    _taxonomyService.DeleteTerm(draftTerm);
}
有了上面的代码,我可以“发布”任意多的次数,并且工作正常

然而,如果我“拒绝”然后发布,我会得到顶级术语“冲突中的永久链接”

如何在下次发布时删除草稿而不产生永久链接冲突


(还要注意,删除草稿不应影响当前已发布术语的永久链接/显示别名)。

好的,基本问题是
\u taxonyservice.DeleteTerm()
正在触发
自动路由处理程序.OnRemoved()
事件方法

此事件方法将调用堆栈到
AliasStorage.Remove()
,该堆栈仅将path/aliassource作为参数,即它将删除与给定路径匹配的所有别名记录,即发布版本仍然依赖的别名

我解决这个问题的方法是用我自己的自定义方法
\u MyTaxonomyService.DeleteDraftTerm()
替换
\u taxonomyService.DeleteDraftTerm()
来删除草案条款。注意从处理程序事件调用中删除AutoRoutePartHandler:

    public void DeleteDraftTerm(ContentItem contentItem)
    {
        var draftVersions = _contentItemVersionRepository.Fetch(x => x.ContentItemRecord == contentItem.Record && x.Latest && !x.Published);
        var context = new RemoveContentContext(contentItem);

        _handlers.Value.Invoke(handler => handler.Removing(context), Logger);

        foreach (var version in draftVersions)
        {
            if (version.Latest)
            {
                version.Latest = false;
            }
        }

       // comment this line out and replace with lines below
       // _handlers.Value.Invoke(handler => handler.Removed(context), Logger);

       var handlersExceptAutoRoute = _handlers.Value.Where(x => x.GetType() != typeof(AutoroutePartHandler));
       handlersExceptAutoRoute.Invoke(handler => handler.Removed(context), Logger);

    }
Tbh,我不确定为什么这是必要的。在我添加这段新代码之前,当我删除带有自动路由部分的草稿内容项时,它似乎导致没有别名记录,但仍然有已发布的自动路由部分记录。因此AutoRoutePartHandler.ProcessAlias()会认为存在重复的发布路径,并发出冲突警告