Sharepoint 2010 在创建列表之前,请检查列表是否已存在

Sharepoint 2010 在创建列表之前,请检查列表是否已存在,sharepoint-2010,splist,Sharepoint 2010,Splist,我正在SharePoint 2010解决方案中使用xml代码创建列表定义和列表实例。现在,每次部署解决方案时,它都会删除列表并创建一个新列表。我只想在列表不存在时创建它 如何检查该列表是否已经存在,以及将代码放在何处 我的列表定义和列表实例出现在我的一个功能中的“功能中的项目”中。SP对象模型中当前没有包含用于确定这一点的方法。正如Beytan提到的,扩展方法可以帮助解决这个问题。我认为这个例子是实现这种扩展方法的更好方法。它遍历整个列表集合,如果找到匹配项,则返回true,如果没有,则返回fa

我正在SharePoint 2010解决方案中使用xml代码创建列表定义和列表实例。现在,每次部署解决方案时,它都会删除列表并创建一个新列表。我只想在列表不存在时创建它

如何检查该列表是否已经存在,以及将代码放在何处


我的列表定义和列表实例出现在我的一个功能中的“功能中的项目”中。

SP对象模型中当前没有包含用于确定这一点的方法。正如Beytan提到的,扩展方法可以帮助解决这个问题。我认为这个例子是实现这种扩展方法的更好方法。它遍历整个列表集合,如果找到匹配项,则返回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方法调用extension方法

using(SPWeb web = (SPWeb)properties.Feature.Parent)
{
   if(!web.ListExists(listTitle))
   {
      //create the list.
   }
}

谢谢你的回答。我在列表实例文件夹中的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>

从代码(web.Lists.Add)创建实例,并使用此选项检查是否已经存在:
web.Lists.TryGetList(“listTitle”)

如何通过服务器端对象模型检查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));
}
//通过其Url验证列表是否存在
公共静态bool listexts(SPWeb web、字符串listUrl)
{
返回web.Lists.Cast().Any(list=>string.Equals(list.RootFolder.ServerRelativeUrl,listUrl));
}

您如何部署此解决方案?这是在Visual Studio 2010执行部署的开发服务器上吗?是的,这是我的开发环境,我使用Visual Studio 2010进行部署。名称“listUrl”让我问:传递列表的名称是否足够,例如“XmlTopDftTestList”或者更需要?ListUrl参数对应于服务器相对url,因为并没有列表名这样的属性。例如,对于文档库,它将是“XMLToPDFTestList”,对于列表,它将是“Lists/XMLToPDFTestList”