我正在使用SharePoint 2010解决方案中的xml代码创建列表定义和列表实例。现在,每次部署我的解决方案时,它都会删除列表并创建一个新列表。我只想创建列表,如果它不存在。
如何检查列表是否已存在以及我在何处放置代码?
我的列表定义和列表实例出现在我的一个功能中的“功能中的项目”中。
答案 0 :(得分:7)
感谢您的回答。我在位于列表实例文件夹中的SharePointProjectItem.spdata文件中找到了该解决方案。将“DeploymentConflictResolutionBehavior”设置为“None”会阻止Visual Studio在每次部署时删除我的列表。
我的SharePointProjectItem.spdata文件现在看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<ProjectItem Type="Microsoft.VisualStudio.SharePoint.ListInstance" DefaultFile="Elements.xml" SupportedTrustLevels="All" SupportedDeploymentScopes="Web, Site" xmlns="http://schemas.microsoft.com/VisualStudio/2010/SharePointTools/SharePointProjectItemModel">
<Files>
<ProjectItemFile Source="Elements.xml" Target="MyListInstance\" Type="ElementManifest" />
</Files>
<ExtensionData>
<ExtensionDataItem Key="DeploymentConflictResolutionBehavior" Value="None" />
</ExtensionData>
</ProjectItem>
答案 1 :(得分:1)
SP对象模型中当前没有包含任何方法来确定这一点。正如Beytan所提到的,扩展方法可以帮助解决这个问题。我认为这个link中的示例是实现此类扩展方法的更好方法。它遍历整个列表集合,如果找到匹配则返回true,否则返回false。以下是该帖子的代码。
public static class SPWebExtensions
{
public static bool ListExists(this SPWeb web, string listName)
{
var lists = web.Lists;
foreach (SPList list in lists)
{
if(list.Title.Equals(listName))
return true;
}
return false;
}
}
由于列表定义和实例已在功能中,因此您可以从功能接收器的FeatureActivated方法中为您的功能调用扩展方法。
using(SPWeb web = (SPWeb)properties.Feature.Parent)
{
if(!web.ListExists(listTitle))
{
//create the list.
}
}
答案 2 :(得分:1)
从代码(web.Lists.Add)创建实例,并使用它来检查是否已存在: web.Lists.TryGetList( “LISTTITLE”)
答案 3 :(得分:1)
如何通过服务器端对象模型检查SPList是否存在:
//Verify if list exist by its Url
public static bool ListExists(SPWeb web, string listUrl)
{
return web.Lists.Cast<SPList>().Any(list => string.Equals(list.RootFolder.ServerRelativeUrl, listUrl));
}