Найти последнюю утвержденную версию разделяемого элемента
-
21-09-2019 - |
Вопрос
Я пытаюсь выполнить итерацию по коллекции 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;
}
}
}
Довольно аккуратно, и я действительно надеюсь, что это сработает при развертывании у заказчика!