管理内容类型的视图(或将视图添加到多个列表)

问题描述 投票:4回答:2

我很惊讶我在网上找不到可以管理内容类型视图的解决方案。我是否真的必须使用浏览器访问每个任务列表来添加/修改视图?

是否有任何解决方案可以让我只为内容类型定义一个视图,从而使这个视图可用于内容类型为的所有列表?

sharepoint views content-type
2个回答
3
投票

直接来说,不,视图不能分配给内容类型。列表包含实际的视图集合,以及使用它创建的相应aspx页面。视图还具有其列表的从属存在:您不能拥有与列表无关的视图。也没有用于向列表添加内容类型的“事件处理程序”,因此每当您向列表添加内容类型时都不会出现一些自动进程(无论如何,这都会很麻烦)必须首先将事件处理程序附加到列表!)。

但这并不是说你必须手动在UI中进行操作才能完成任务。在自定义代码工作流中使用对象模型,您可以扫描整个SPWeb并在具有指定内容类型的每个列表上创建新视图。您只需要一个具有单个代码活动的工作流,该活动将遍历SPWeb.Lists中的所有SPL列表,并检查该SPList是否具有与目标内容类型同名的内容类型。如果是,请使用您需要的参数创建新的SPView。由于您不能简单地创建一个SPView并将其克隆,因为SPView必须与列表相关联并且克隆SPView只是将其克隆到同一列表中,您将必须在每个循环中运行整个SPView创建。但是你只需要编写一次,这是系统必须多次运行它。天哪,它肯定能比你在UI中跳舞几个小时更有效率。

只要您需要重新确认SPView的存在,就可以运行工作流程。


0
投票

我在c#中找到了this解决方案,但是我还没有测试过它。我将来会对它进行测试,如有必要,请更新。

显然,它适用于SharePoint 2010,但它也可以在更高版本中使用。

private void CreateView(string strViewName)
{
    try
    {
        string fieldName = //Get Field Internal Name
        var docquery = "<Where><Eq><FieldRef Name='" + fieldName.ToString() + "' /><Value Type='Choice'>" + strViewName.ToString() + "</Value></Eq></Where>";
        System.Collections.Specialized.StringCollection viewFields = new System.Collections.Specialized.StringCollection();
        viewFields.Add("Type");
        viewFields.Add("Name");
        viewFields.Add("Modified");
        viewFields.Add("Modified By");
        viewFields.Add(fieldName.ToString());
        oViewCollection.Add(strViewName, viewFields, docquery, 100, true, false);
        web.Update();
    }
    catch (Exception e)
    {
        throw new SPException(e.Message.ToString());
    }
}

我还在PowerShell中找到了this解决方案......

Add-PSSnapin Microsoft.SharePoint.PowerShell -EA silentlycontinue

#Title View
$viewTitle = "Sort by modified date"
#Add the column names from the ViewField property to a string collection
$viewFields = New-Object System.Collections.Specialized.StringCollection
$viewFields.Add("DocIcon") > $null
$viewFields.Add("LinkFilename") > $null
$viewFields.Add("Modified") > $null
$viewFields.Add("Editor") > $null
$viewFields.Add("FileSizeDisplay") > $null
#Query property
$viewQuery = "<OrderBy><FieldRef Name='Modified' Ascending='FALSE'/></OrderBy>"
#RowLimit property
$viewRowLimit = 50
#Paged property
$viewPaged = $true
#DefaultView property
$viewDefaultView = $false

$ListsToUpdate = @()

$App = Get-SPWebApplication  http://....
foreach ($Site in $App.Sites)
{
    foreach ($Web in $Site.AllWebs)
    {
        foreach ($List in $Web.Lists)
        {
            if($List.BaseType -eq "DocumentLibrary" -and $List.Title -eq "Documents" )
            {
                $ListsToUpdate += $Web.Lists[$List.Title]
            }
        }
    }
}


foreach($List in $ListsToUpdate) 
{
    Write-Host $List.Title
    #Create the view in the destination list
    $newview = $List.Views.Add($viewTitle, $viewFields, $viewQuery, $viewRowLimit, $viewPaged, $viewDefaultView)
}
© www.soinside.com 2019 - 2024. All rights reserved.