【问题标题】:Check if a list already exists before creating it在创建列表之前检查列表是否已经存在
【发布时间】:2011-11-21 02:58:13
【问题描述】:

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

如何检查列表是否已存在以及将代码放在哪里?

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

【问题讨论】:

  • 您如何部署此解决方案?这是在使用 Visual Studio 2010 执行部署的开发服务器上吗?
  • 是的,这是我的开发环境,我使用 Visual Studio 2010 部署它。

标签: sharepoint-2010 splist


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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.
       }
    }
    

    【讨论】:

      【解决方案3】:

      从代码(web.Lists.Add)创建实例,并使用它来检查是否已经存在: web.Lists.TryGetList("listTitle")

      【讨论】:

        【解决方案4】:

        如何通过服务器端对象模型检查 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));
        }
        

        【讨论】:

        • “listUrl”这个名字让我问:传递列表的名字就够了,比如“XMLToPDFTestList”还是需要更多?
        • ListUrl 参数对应于服务器相对 url,因为没有 List Name 这样的属性。例如,对于文档库,它将是“XMLToPDFTestList”,对于列表“Lists/XMLToPDFTestList”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-03
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多