SharePoint 2010ソリューションで、リスト定義とxmlコードを使用したリストインスタンスを作成しています。これで、ソリューションをデプロイするたびに、リストが削除され、新しいリストが作成されます。リストが存在しない場合にのみリストを作成したいと思います。
リストがすでに存在するかどうかを確認するにはどうすればよいですか?また、コードはどこに配置すればよいですか?
私のリスト定義とリストインスタンスは、私の機能の1つにある「機能内のアイテム」の中に表示されます。
SharePoint 2010ソリューションで、リスト定義とxmlコードを使用したリストインスタンスを作成しています。これで、ソリューションをデプロイするたびに、リストが削除され、新しいリストが作成されます。リストが存在しない場合にのみリストを作成したいと思います。
リストがすでに存在するかどうかを確認するにはどうすればよいですか?また、コードはどこに配置すればよいですか?
私のリスト定義とリストインスタンスは、私の機能の1つにある「機能内のアイテム」の中に表示されます。
ご回答ありがとうございます。リストインスタンスフォルダーにあるSharePointProjectItem.spdataファイルで解決策を見つけました。「DeploymentConflictResolutionBehavior」を「None」に設定すると、VisualStudioはすべての展開でリストを削除できなくなりました。
私の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>
これを決定するための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メソッドから拡張メソッドを呼び出すことができます。
using(SPWeb web = (SPWeb)properties.Feature.Parent)
{
if(!web.ListExists(listTitle))
{
//create the list.
}
}
コード(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));
}