我很惊讶我在网上找不到可以管理内容类型视图的解决方案。我是否真的必须使用浏览器访问每个任务列表以添加/修改视图?
是否有任何可用的解决方案可以让我只为内容类型定义一个视图,从而使这个视图在内容类型为的所有列表中可用?
答案 0 :(得分:3)
直接说,否,视图无法分配给内容类型。列表包含实际的视图集合,以及使用它创建的相应aspx页面。视图还具有其列表的从属存在:您不能拥有与列表无关的视图。也没有用于向列表添加内容类型的“事件处理程序”,因此每当您向列表添加内容类型时都不会出现一些自动进程(无论如何,这都会很麻烦)必须首先将事件处理程序附加到列表中!)。
这并不是说您必须在UI中手动进行操作才能完成任务。在自定义代码工作流程中使用对象模型,您可以扫描整个任务SPWeb并在具有指定内容类型的每个列表上创建新视图。您只需要一个具有单个代码活动的工作流,该活动将遍历SPWeb.Lists中的所有SPL列表,并检查该SPList是否具有与目标内容类型同名的内容类型。如果是,请使用您需要的参数创建新的SPView。由于您不能简单地创建一个SPView并将其克隆,因为SPView必须与列表相关联并且克隆SPView只是将其克隆到同一列表中,您将必须在每个循环中运行整个SPView创建。但是你只需要编写一次,这是系统必须多次运行它。天哪,它肯定会比你在UI中跳舞几个小时更有效率。
只要您需要重新确认SPView的存在,只需运行工作流程。
答案 1 :(得分: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)
}