以编程方式配置每个位置的视图设置

Configure per-location view settings programmatically

我的 SharePoint 网站上有一个功能,可以在激活该功能时将视图添加到列表中。

在 SharePoint 的列表设置菜单上,我们有一个 link,上面写着 "display settings by location"(或英文安装中的 "Per-location view settings")。当我激活我的功能时,我所有的视图都在 "views available at this location" 的右栏中。但是对于某些视图,我希望它们位于左栏中,"views hidden at this location"。

我尝试将相关视图的参数 "Hidden" 设置为 true,但这导致我的视​​图从每个位置的视图设置页面中完全消失。

是否可以在 C# 或 Powershell 中管理在特定位置显示/隐藏哪些视图?

此实例中的位置是指列表中的文件夹(如果不存在其他文件夹,则为根文件夹)。

要访问特定文件夹中显示或隐藏的视图,请访问该文件夹的 client_MOSS_MetadataNavigationSettings 属性。

属性 将是包含 <ViewSettings> 元素的 XML 字符串,在其中您将看到 <View> 已配置的任何视图的元素具有特殊的每个位置设置。如果视图设置为从该位置隐藏,则 <View> 节点的 Index 属性将是负数的字符串表示形式。

一个全新的视图将默认显示在所有文件夹中,但不会在 <ViewSettings> 集合中有一个条目;如果你想隐藏它,你需要创建一个新的 XML 元素并将它插入到 属性.

以下是 Powershell 中从根文件夹隐藏视图的示例:

$viewName = "Secret View"
$web = get-spweb http://example-site
$list = $web.Lists["Example List"]
$viewToHide = $list.Views | where-object { $_.Title -like $viewName }
$folder = $list.RootFolder
$settings = [xml]$folder.GetProperty("client_MOSS_MetadataNavigationSettings")
$view = $settings.MetadataNavigationSettings.ViewSettings.View | where-object { $_.ViewId -like $viewToHide.Id }
if($view -ne $null){
    $view.Index = "-1"
}else{
    $view = $settings.CreateElement("View")
    $settings.MetadataNavigationSettings.ViewSettings.AppendChild($view)
    $view.setAttribute("ViewId",$viewToHide.Id)
    $view.setAttribute("CachedName",$viewToHide.Title)
    $view.setAttribute("Index","-1")
    $view.setAttribute("CachedUrl",$viewToHide.Url)
}
$folder.SetProperty("client_MOSS_MetadataNavigationSettings",$settings.OuterXml)
$folder.Update()