Найти последнюю утвержденную версию разделяемого элемента

StackOverflow https://stackoverflow.com/questions/1366242

Вопрос

Я пытаюсь выполнить итерацию по коллекции SPListItem.Versions, чтобы найти последний утвержденный элемент списка.

Элемент моего списка имеет три версии:первые два утверждены, последний находится в проекте.Но мой код говорит, что все они находятся в черновике!Пожалуйста, помогите!

// Iterate through all versions
for (int index = 0; index < item.Versions.Count; index++)
{
    SPListItem versionedItem = item.Versions[index].ListItem;

    // Check if moderation information is set to approved
    if (versionedItem.ModerationInformation.Status.Equals(SPModerationStatusType.Approved))
    {
        // We found an approved version!
        itemFound = versionedItem;
    }
}
Это было полезно?

Решение

item.Versions[index] возвращает экземпляр SPListItemVersion и SPListItemVersion.ListItem возвращает родительский SPListItem.Таким образом, ваш versionedItem в конечном итоге будет ссылаться на тот же объект, что и item , и вы проверяете одну и ту же версию снова и снова.

Я верю, что вы действительно хотите проверить

if (item.Versions[index].Level == SPFileLevel.Published) {
  // check item.Versions[index].VersionLabel
}

Другие советы

Способ, который рекомендует Маттиас и который вы внедрили, - лучший способ сделать это.Это немного неудобно, но все еще эффективно, поскольку товары упорядочиваются от самых последних к самым старым.Это означает, что вы, скорее всего, быстро получите совпадение с опубликованной версией.

Расширяя информацию о MSDN splistitemversionколлекционная статья (в частности, дополнение Себастьяна Войцеховского):

// Current version of the item (note: this may be a draft)
SPListItem.Versions[0]

// Previous version of the item
SPListItem.Versions[1]

// First version of the item
SPListItem.Versions[SPListItem.Versions.Count - 1]

Мой код в итоге выглядел примерно так:

if (doclist.EnableVersioning)
{
    SPListItemVersionCollection allVersions = item.Versions;

    // Iterate through all versions
    foreach (SPListItemVersion version in allVersions)
    {
        if (version.Level == SPFileLevel.Published)
        {
            itemFound = version.ListItem;
        }
    }
}

Довольно аккуратно, и я действительно надеюсь, что это сработает при развертывании у заказчика!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top