ForceCurrentVersion对EPiServer

时间:2016-06-08 12:12:45

标签: episerver

如果您尝试使用 ForceCurrentVersion 标志设置保存一些已发布的内容,则在看似不合逻辑的情况下会失败。例如:

contentRepository.Save(publishedPage, SaveAction.ForceCurrentVersion);

将导致错误:

ERROR: The provided action 'ForceCurrentVersion' is not allowed on this content (ContentLink=257864_794789, VersionStatus=Published)

但是,如果我添加SaveAction.Publish,则运行正常:

contentRepository.Save(publishedPage, SaveAction.Publish | SaveAction.ForceCurrentVersion)

这有什么逻辑吗?

我为什么要问?

在升级到最新版本的EPiServer之前,以下代码适用于已发布的未发布的内容:

// On the CreatedContent event

MakeTheShortUrlLowerCase(writablePage);

// Save without creating a new version:
contentRepository.Save(writablePage, SaveAction.ForceCurrentVersion | SaveAction.SkipValidation);

但升级后,保存功能seem to have changed的行为。为了让它再次运行,我们不得不对代码进行复杂化,并对发布的内容进行额外检查:

// On the CreatedContent event

MakeTheShortUrlLowerCase(writablePage);

// Check if published, then select save alternative
if (pageData.CheckPublishedStatus(PagePublishedStatus.PublishedIgnoreDates))
{
    contentRepository.Save(writablePage, SaveAction.Publish | SaveAction.ForceCurrentVersion | SaveAction.SkipValidation);
}
else
{
    contentRepository.Save(writablePage, SaveAction.ForceCurrentVersion | SaveAction.SkipValidation);
}

对我而言,这种“修复”似乎有点不必要,而且确实没有多大意义。

更新

为了将来的参考,以下是我最终要做的事情:我实现了一个简单的帮助器类来处理使用ForceCurrentVersion的情况:

    private static SaveAction GetForcedSaveActionFor(IVersionable page)
    {
        var saveAction = SaveAction.SkipValidation | SaveAction.ForceCurrentVersion;
        switch (page.Status)
        {
            case VersionStatus.Published:
                saveAction = saveAction | SaveAction.Publish;
                break;
            case VersionStatus.CheckedIn:
                saveAction = saveAction | SaveAction.CheckIn;
                break;
            default:
                saveAction = saveAction | SaveAction.Save;
                break;
        }
        return saveAction;
    }

然后可以使用如下:

            var saveAction = GetForcedSaveActionFor(pageData);
            contentRepository.Save(writablePage, saveAction);

这自然不会涵盖VersionStatus的所有情况,但你明白了。

3 个答案:

答案 0 :(得分:2)

SaveActions枚举有一些非正统的分割,其中一些值代表主命令(保存,发布,CheckIn等),而一些值代表不同的选项(ForceCurrentVersion,SkipValidation)。

当只将选项标记传递给Save方法时,实际上只传递选项而没有任何命令。以前使用尽力而为的方法来找出在没有提供命令的情况下将使用哪个命令,但事实证明,这在很多情况下都不是很容易预测,并且还导致内容在没有发布的情况下发布正在筹集的事件并发布要完成的特定验证。

尝试改善CMS 8的情况,现在要求您在更新发布的内容时提供包含主命令的SaveAction。遗憾的是,您发现了副作用,您需要更清楚地了解应该使用哪个SaveAction命令。希望您能够隐藏实用方法背后的评估。

当前的解决方案在可用性方面留下了很多希望,并且在此代码中仍然存在边缘情况不规则,但由于在不进行重大更改的情况下很难在此进行任何改进,因此进度可以慢一点。

更新

上述答案仅适用于Episerver CMS版本9.此行为在CMS 10中已更改,SaveAction.ForceCurrentVersion现在可以自行运行,而无需将其与其他操作相结合。有关此次更新的详细信息,请参阅this CMS 10 release note

答案 1 :(得分:1)

我记得您无法将 ForceCurrentVersion 发布结合使用,即您无法覆盖已发布的版本?它不会引发异常,但您将有效地获得新版本(即您将在版本列表中看到以前发布的版本的内容)。

ForceCurrentVersion 隐式表示保存,但您无法再明确地将它们合并为SaveAction.Save | SaveAction.ForceCurrentVersion(抛出异常):http://world.episerver.com/documentation/Items/Upgrading/EPiServer-CMS/8/Breaking-changes/

答案 2 :(得分:0)

我很确定你在第一次保存内容时不能使用SaveAction.ForceCurrentVersion,即没有以前版本“强制”它。情况一直如此。