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 属性似乎总是文件最初创建的日期。
谢谢
迪伦
我建议考虑以下选项:
可能这是利用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)
| 归档时间: |
|
| 查看次数: |
6405 次 |
| 最近记录: |