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