使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion
Posted
技术标签:
【中文标题】使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion【英文标题】:Programmatically get ListItemVersion using client object model SharePoint 2010 【发布时间】:2013-03-02 18:25:12 【问题描述】:我有一个场景,我必须将 SharePoint 2010 列表(名称=“VersionTestList”)中的所有数据移动到 SQL 服务器数据库。由于列表中启用了版本控制,我也想移动以前的版本详细信息。无论如何我能够移动最新的项目,但不幸的是我无法获得以前的版本数据。我已经尝试过使用客户端对象模型并能够获取版本,但无法获取相应版本的 ListItem。请在下面找到我到目前为止尝试过的代码,并帮助我解决这个问题。
另外,我正在使用这样的 ListItem 版本:
string path = web.ServerRelativeUrl + "/Lists/VersionTestTable/1_.000";
File file = web.GetFileByServerRelativeUrl(path);
clientContext.Load(file, item=>item.ListItemAllFields);
FileVersionCollection versions = file.Versions;
clientContext.Load(versions);
oldVersions = clientContext.LoadQuery(versions.Where(v => v != null));
clientContext.ExecuteQuery();
我的整个代码是这样的:
class Program
static void Main(string[] args)
GetVersionsUsingCOM();
public static void GetVersionsUsingCOM()
File file;
FileVersionCollection versions;
IEnumerable<Microsoft.SharePoint.Client.FileVersion> oldVersions;
ClientContext clientContext = new ClientContex("http://server:1200/test/Poc");
Web web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
string path = web.ServerRelativeUrl + "/Lists/VersionTestTable/1_.000";
file = web.GetFileByServerRelativeUrl(path);
clientContext.Load(file, item=>item.ListItemAllFields);
//clientContext.ExecuteQuery();
versions = file.Versions;
clientContext.Load(versions);
oldVersions = clientContext.LoadQuery(versions.Where(v => v != null));
clientContext.ExecuteQuery();
if (oldVersions != null)
foreach (Microsoft.SharePoint.Client.FileVersion _version in oldVersions)
int count=0;
Console.WriteLine(_version.CheckInComment);
Console.WriteLine("Version : 0", _version.VersionLabel);
//// Working fine till here but unable to get the version details from version.Url
string versionItemUrl = web.ServerRelativeUrl +"/" + _version.Url;
File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl);
clientContext.Load(oldFile, f=>f.ListItemAllFields);
clientContext.ExecuteQuery();
Console.WriteLine(oldFile.ListItemAllFields["Name"]);
count++;
oldVersions = null;
Console.ReadLine();
【问题讨论】:
【参考方案1】:你必须像这样初始化web.ServerRelativeUrl
oldVersions = clientContext.LoadQuery(versions.Where(v => v != null));
clientContext.Load(web, w => w.ServerRelativeUrl);
clientContext.ExecuteQuery();
【讨论】:
不走运,我得到The object specified does not belong to a list.
如果我使用var oldFile = web.GetFileByServerRelativeUrl("/" + _version.Url); clientContext.Load(file, item => item.ListItemAllFields); clientContext.ExecuteQuery();
,我会收到Value does not fall within the expected range.
错误。【参考方案2】:
你可以像这样获取旧版本文件
string versionItemUrl = file.ServerRelativeUrl.Replace(Path.GetFileName(file.ServerRelativeUrl),"") + _version.Url;File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl);
clientContext.Load(oldFile, f=>f.ListItemAllFields);clientContext.ExecuteQuery();
【讨论】:
【参考方案3】:您应该能够使用SPFileVersion.Properties
获取列表项数据,这将为您提供文件元数据的哈希表,请参阅MSDN - SPFileVersion.Properties Property。
在您的foreach
内尝试
Hashtable oHash = oFileVersion.Properties;
ICollection collKeys = oHash.Keys;
foreach (object oKey in collKeys)
Console.WriteLine(oKey.ToString() + " :: " + oHash[oKey.ToString()].ToString());
【讨论】:
在尝试使用客户端对象模型时,服务器对象模型类没有提供太多帮助。以上是关于使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion的主要内容,如果未能解决你的问题,请参考以下文章
使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion
Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)
SharePoint 2010客户端对象模型 - 需要代理身份验证