如何在文档库中创建一个新项目作为文件 link?
How to create a new item as file link in document library?
我必须使用 SPFileCollection.Add 方法将新项目添加到文档库中,但似乎不适合重载此方法。
场景:
如果将文件添加到文档库并且带有多个 select(复选框)的部门选择字段具有 selected 值,则 itemUpdated 事件应该创建 links 到添加selected 部门采购文件夹中的文件。
目前发生了什么:
该代码将文件添加为新文件而不是 link.
我尝试了以下...
string departments = Convert.ToString(properties.ListItem[Constants.Departments]);
if (!string.IsNullOrEmpty(departments))
{
string[] linkTargets = departments.Split(';', '#');
string purchasingLink = string.Concat(properties.Web.Url, "/", properties.List.RootFolder.Url, "/", Constants.Purchasing, "/");
foreach (string linkTarget in linkTargets)
{
if (!string.IsNullOrEmpty(linkTarget))
{
SPFolder targetFolder = properties.Web.GetFolder(purchasingLink + linkTarget);
SPFileCollection targetLibFiles = properties.List.RootFolder.Files;
targetLibFiles.Add()
string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);
SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary());
SPListItem newItem = newFile.Item;
newItem[SPBuiltInFieldId.ContentType] = SPBuiltInContentTypeId.LinkToDocument;
SPFieldUrlValue linkFieldValue = new SPFieldUrlValue();
linkFieldValue.Url = fileUrl;
newItem[SPBuiltInFieldId.URL] = linkFieldValue;
newItem.Update();
}
}
}
更新:
所以我在他的评论中查看了 James Michal Lucas 编辑的 blog post link。
我无法复制粘贴它,因为该方法中使用的重载不存在,但它有一些有趣的点,例如哈希表,用于在 Add(...) 方法中提供内容类型。
在我的代码中产生的修改:
Hashtable itemProperties = new Hashtable();
SPContentTypeId ctId = SPBuiltInContentTypeId.LinkToDocument;
itemProperties["ContentTypeId"] = ctId.ToString();
string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);
SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary(), itemProperties);
执行此命令然后使用 powershell 检查新项目的内容类型显示:
PS C:\Users\xy> $file.Item.ContentType.Name
Link 到文档
但是删除原始文件不会禁用 "link"。它仍然可以正常工作。所以它毕竟不是link。
我设法找到了 this post 的解决方案。
简而言之:
直接添加 SPLink 似乎是不可能的,你必须伪造它。 post 描述了如何创建使用 GUI 添加 link 时 sharepoint 生成的 .aspx 文件。然后该文件作为新项目添加到库中,代表 link.
我必须使用 SPFileCollection.Add 方法将新项目添加到文档库中,但似乎不适合重载此方法。
场景: 如果将文件添加到文档库并且带有多个 select(复选框)的部门选择字段具有 selected 值,则 itemUpdated 事件应该创建 links 到添加selected 部门采购文件夹中的文件。
目前发生了什么: 该代码将文件添加为新文件而不是 link.
我尝试了以下...
string departments = Convert.ToString(properties.ListItem[Constants.Departments]);
if (!string.IsNullOrEmpty(departments))
{
string[] linkTargets = departments.Split(';', '#');
string purchasingLink = string.Concat(properties.Web.Url, "/", properties.List.RootFolder.Url, "/", Constants.Purchasing, "/");
foreach (string linkTarget in linkTargets)
{
if (!string.IsNullOrEmpty(linkTarget))
{
SPFolder targetFolder = properties.Web.GetFolder(purchasingLink + linkTarget);
SPFileCollection targetLibFiles = properties.List.RootFolder.Files;
targetLibFiles.Add()
string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);
SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary());
SPListItem newItem = newFile.Item;
newItem[SPBuiltInFieldId.ContentType] = SPBuiltInContentTypeId.LinkToDocument;
SPFieldUrlValue linkFieldValue = new SPFieldUrlValue();
linkFieldValue.Url = fileUrl;
newItem[SPBuiltInFieldId.URL] = linkFieldValue;
newItem.Update();
}
}
}
更新: 所以我在他的评论中查看了 James Michal Lucas 编辑的 blog post link。
我无法复制粘贴它,因为该方法中使用的重载不存在,但它有一些有趣的点,例如哈希表,用于在 Add(...) 方法中提供内容类型。 在我的代码中产生的修改:
Hashtable itemProperties = new Hashtable();
SPContentTypeId ctId = SPBuiltInContentTypeId.LinkToDocument;
itemProperties["ContentTypeId"] = ctId.ToString();
string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);
SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary(), itemProperties);
执行此命令然后使用 powershell 检查新项目的内容类型显示:
PS C:\Users\xy> $file.Item.ContentType.Name
Link 到文档
但是删除原始文件不会禁用 "link"。它仍然可以正常工作。所以它毕竟不是link。
我设法找到了 this post 的解决方案。
简而言之:
直接添加 SPLink 似乎是不可能的,你必须伪造它。 post 描述了如何创建使用 GUI 添加 link 时 sharepoint 生成的 .aspx 文件。然后该文件作为新项目添加到库中,代表 link.