【问题标题】:Manage views for content types (or add a view to multiple lists)管理内容类型的视图(或将视图添加到多个列表)
【发布时间】:2011-02-16 16:47:29
【问题描述】:

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

是否有任何可用的解决方案允许我为内容类型定义一个视图,从而使该视图在内容类型所在的所有列表中可用?

【问题讨论】:

  • 这也正是我想要的!

标签: sharepoint views content-type


【解决方案1】:

我在 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)
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 当然,这是可以通过编程实现的。好的,当内容类型添加到列表时它不会自动发生,但我想也许有一个解决方案可以让您定义一个自动添加到当前列表的视图。
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2019-06-23
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多