SharePoint/GetVersionCollection - 如何识别哪个版本?

Dyl*_*son 4 sharepoint sharepoint-2013 csom

我需要能够从 SharePoint 列表中的项目查询旧字段值。我无法在服务器上执行代码(它需要使用 SharePoint Online/O365 才能开始)。到目前为止,我拥有的唯一 API 是 list.asmx GetVersionCollection SOAP 调用。这让我可以指定单个字段名称并返回一个 XML 结构,其中包含各种版本的值,以及修改时间和谁​​进行了更改 - 但没有可靠的方法来实际识别哪个版本版本(即 ID 或标签)。也就是说,如果我知道我需要从列表“文档”中项目 1 的版本 512 中获取 Title 值,我看不到如何可靠地解析结果以确定哪个条目是版本 512。虽然它们可能会在顺序,在许多情况下,当不存在字段值时(或者可能尚未创建该字段时),条目实际上会丢失。我尝试将修改日期与相应 FileVersion 项目的创建日期进行比较(我可以通过 CSOM 或 REST 获得),虽然它有时有效,但它并不可靠。我还查看了lists.asmx GetVersion API 的输出,但我也看不出这有什么用,因为所有版本的 Created 属性似乎总是​​文件最初创建的日期。

谢谢

迪伦

Vad*_*hev 5

我建议考虑以下选项:

使用 SharePoint Web 服务

可能这是利用Lists.GetVersionCollection 方法的最佳选择,但正如您在问题中正确提到的,您只能请求每个字段的版本信息。以下示例演示如何检索多个字段的版本信息并确定版本信息。

C# 示例

public static Dictionary<string, List<VersionProperty>> GetVersionHistory(Uri webUri, string listName, int itemId, string[] fieldsToRetrieve)
{

        var listsProxy = new Lists.Lists();
        listsProxy.Url = webUri + "/_vti_bin/Lists.asmx";

        //Retrieve version labels
        var versionsResult = listsProxy.GetVersionCollection(listName, itemId.ToString(), "Version");
        var versionsXml = XElement.Parse(versionsResult.OuterXml);
        XNamespace xmlns = "http://schemas.microsoft.com/sharepoint/soap/";
        var versionLabels = versionsXml.Descendants(xmlns + "Version").Select(e => new VersionLabel()
        {
            VersionNo = e.Attribute("Version").Value,
            Modified = e.Attribute("Modified").Value,
            ModifiedBy = e.Attribute("Editor").Value
        }).ToList();

        //Retrieve properties
        var versionHistory = new Dictionary<string, List<VersionProperty>>();
        foreach (var f in fieldsToRetrieve)
        {
            versionsResult = listsProxy.GetVersionCollection(listName, itemId.ToString(), f);
            versionsXml = XElement.Parse(versionsResult.OuterXml);
            var properties = versionsXml.Descendants(xmlns + "Version").Select((e, i) => new VersionProperty { Label = versionLabels[i], Value = e.Attribute(f).Value });
            versionHistory[f] = properties.ToList(); 
        }
        return versionHistory;
}
Run Code Online (Sandbox Code Playgroud)

在哪里

public class VersionLabel
{
    public string VersionNo { get; set; }

    public string Modified { get; set; }

    public string ModifiedBy { get; set; }

}

public class VersionProperty
{
    public VersionLabel Label { get; set; }

    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用法

var listName = "Documents";
var itemId = 1;
var fieldsToRetrieve = new[] { "Title", "TaxKeyword" };
var versionHistory = GetVersionHistory(webUri, listName, itemId, fieldsToRetrieve);
Run Code Online (Sandbox Code Playgroud)

结果

Versions.aspx应用程序页面提取版本历史

另一种请求Versions.aspx开箱即用的 SharePoint 应用程序页面并从 html 内容中提取版本历史信息的选项。

Versions.aspx 页面

在此处输入图片说明

下面的例子演示了如何加载Versions.aspx页面内容(省略了负责提取版本信息的部分)。

C# 示例

 public static  Dictionary<string, List<VersionProperty>> GetVersionsPageInfo(string webUrl,ICredentials credentials, Guid listId,int itemId)
 {
        var versionsPageUrl = string.Format("{0}/_layouts/versions.aspx?list={1}&ID={2}",webUrl, listId,itemId);
        using (var client = new WebClient())
        {
            client.Credentials = credentials;
            client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
            var content = client.DownloadString(versionsPageUrl);
            //extract version history info goes here.. 
        }
 }
Run Code Online (Sandbox Code Playgroud)