splisteventreceiver.listaddedの人種状態 - 競合を保存します
-
16-10-2019 - |
質問
現在、SharePoint 2010のイベントハンドラーを開発しており、作成に関するドキュメントライブラリのデフォルトを設定しています(コンテンツタイプ、バージョン設定など)。 GUIを介してドキュメントライブラリを作成する際に、競合を保存することに問題があります。GUIがリストを保存した後、イベントレシーバーは常に実行されるとは限りません。
私は仮定しました ListAdded
GUIが適切にリストの作成を完了し、保存した後に呼び出されますが、そうではないようです。でプロパティを設定しようとしました ListAdding
機能ですが、変更は保存されません(リストにまだ作成されていないため)。
Visual Studioでデバッグするときに、次のメッセージを受け取ります。
競合を保存します。
あなたの変更は、他のユーザーによって同時に行われたものと矛盾します。変更を適用したい場合は、Webブラウザで[戻り]をクリックし、ページを更新し、変更を再送信します。
のスタックトレースで:
Microsoft.SharePoint.SpexceptionはユーザーコードErrorCode = -2130575305 NativeRromessage =故障したHR検出(HR = 0x81020037)によって処理されませんでした。
nativestacktrace = ""メッセージ=競合を保存します。
あなたの変更は、他のユーザーによって同時に行われたものと矛盾します。変更を適用したい場合は、Webブラウザで[戻り]をクリックし、ページを更新し、変更を再送信します。 Source = Microsoft.SharePoint Stacktrace:at Microsoft.SharePoint.Spglobal.HandleComexception(Comexception Comex)at Microsoft.sharepoint.sharepoint.sprequest.setListProps(String Bstrurl、String BstrlistName、Boolean Bigrate) ) at Company.SharePoint.EventReceivers.ListCreate.CompanyListCreateEventReceiver.ListAdded(SPListEventProperties properties) at Microsoft.SharePoint.SPEventManager.RunListEventReceiver(SPListEventReceiver receiver, SPUserCodeInfo userCodeInfo, SPListEventProperties properties, String receiverData) at Microsoft.SharePoint.SPEventManager.RunListEventReceiverHelper(Object receiver, spusercodeinfo usercodeinfo、オブジェクトプロパティ、speventcontextコンテキスト、string receiverdata)at microsoft.sharepoint.speventmanager。 :system.runtime.interopservices.comexセプション
およびのULSログ:
02/25/2011 11:12:52.06 w3wp.exe(0x363c)0x219c Sharepoint Foundation General 8e2s中程度の不明な診察エラーが発生しました。詳細:0x8007047E F35857AF-3D3A-462C-86A6-DE24D3B3D8D3
02/25/2011 11:12:52.06 W3WP.EXE(0x363C)0x219C SharePoint Foundation General 72K4 Medium 0x8007047E F35857AF-3D3A-462C-86A6-DE24D3B3D3B3D3B3D3D3D3
02/25/2011 11:12:52.06 W3WP.EXE(0x363C)0x219C SharePoint Foundation General 8KH7 High 0x8007047E F35857AF-3D3A-462C-86A6-DE24D3B3D8D3D3D3D3D3
競合が発生しないことを保証する方法、または競合しないリストプロパティに設定またはアクセスする方法がありますか? Spsite/Spwebの別のインスタンスを作成するのは疲れていますが、それでも同じ問題があります。
失敗しているコードの簡単な例は次のとおりです。
public class CompanyListCreateEventReceiver : SPListEventReceiver
{
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPList l_list = properties.List;
l_list.Title = "Changed title";
l_list.Update();
}
}
どんな助けも感謝します。ありがとう!
解決
ItemAddedイベントを同期イベントとして登録する必要があります。speventreceiversynchronization.synchronous
プログラムで定義できます。http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.speventreceiverdefinition.synchronization.aspx
または機能定義のレシーバー要素で:http://msdn.microsoft.com/en-us/library/ff512765.aspx
他のヒント
私はしばらくの間、SharePointイベントレシーバーと戦っています。 SharePoint IMOのこの部分における多くの落とし穴と予期しないロジック。
私はこれまでこの正確な問題を見たことがありませんが、とにかく1つの提案をすることができます。私の経験では、プロパティリストを変更すると問題が発生する場合があります。そのため、代わりにWebからリストを取得したいのです。これが失敗した場合(私のために機能しました)、Web.urlから新しいspwebもインスタンス化してみてください。
この場合、次のアプローチを試すことをお勧めします。
public class CompanyListCreateEventReceiver : SPListEventReceiver
{
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPList l_list = properties.Web.Lists[properties.List.ID];
l_list.Title = "Changed Title";
l_list.Update();
}
}
element.xmlファイルに「同期」を指定する必要があるかもしれません。 http://sharepointconnoisseur.blogspot.com/2011/04/save-conflict-error-when-creating-list.html
イベントを無効にし、イベント方法を有効にしてください。
2)(イベントハンドラーからアイテムを更新することで役立ちます)
Item[FieldName] = FieldValue;
this.DisableEventFiriing();
item.SystemUpdate(false);
or
item.Update();
this.EnableEventFiring();
//must enable event firing if we are disable it