我建议考虑以下选项:
使用 SharePoint Web 服务
这可能是使用Lists.GetVersionCollection Method 的最佳选择,但正如您在问题中正确提到的那样,您只能请求每个字段的版本信息。以下示例演示如何检索多个字段的版本信息并确定版本信息。
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;
}
在哪里
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; }
}
用法
var listName = "Documents";
var itemId = 1;
var fieldsToRetrieve = new[] { "Title", "TaxKeyword" };
var versionHistory = GetVersionHistory(webUri, listName, itemId, fieldsToRetrieve);
结果
从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..
}
}