1

そこで、SharePoint 2010 リストでこの種の機能を実現しようとしています。

リストにタイプ選択のフィールドがあり、7 つの値があり、ユーザーがそのフィールドの値を値 2、3、4、5、6、7 から値 1 に変更できないようにします。

そのリストのイベント レシーバーを作成しました。コードは次のとおりです。

public override void ItemUpdated(SPItemEventProperties properties)
   {
       base.ItemUpdated(properties);

       string beforeStatus = properties.BeforeProperties["Status"].ToString();
       string afterStatus = properties.AfterProperties["Status"].ToString();

       if (beforeStatus != "1stValue" && afterStatus == "1stValue")
       {
           properties.Cancel = true;
           properties.ErrorMessage = "This isn't allowed.";
       }
   }

ItemUpdatedとイベントレシーバーの両方を使用してみました。ItemUpdatingデバッグ中に、イベントレシーバーが本来あるべきように呼び出されるのを見ましたがbeforeStatus、どちらの場合もアイテムからafterStatus取得しています。null

では、正しく更新する前後の項目のフィールドの値を取得するにはどうすればよいでしょうか? 前もって感謝します!

注: フィールドの内部名と表示名は両方ともStatus.

4

2 に答える 2

4

ItemUpdating イベントを使用すると、afterproperties には変更された値が含まれ、ListItem にはフィールドの元の値が含まれます。

ここでは、各イベントで利用可能なプロパティに関する情報を見つけることができます。

リスト項目をどのように編集するかも重要です。SharePoint の既定の編集フォームを使用すると、すべての列が afterproperties コレクションに存在しますが、カスタム コード (Web パーツ、イベント受信など) からアイテムを編集すると、更新された列のみがそのコレクションに存在します。

編集:見栄えの良いエラーの場合、ユーザーをカスタムエラーページ(作成する必要があります)にリダイレクトできます

properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl; 
properties.RedirectUrl = "/_layouts/MySolution/CustomErrorPage.aspx?Error=" + errorMessage;
于 2013-09-13T12:43:25.427 に答える
1

私は自分でこれに対する解決策を見つけました:

この記事によると、古い値と新しい値の両方を取得したい場合は、ItemUpdatingイベント レシーバーを使用properties.ListItemして古い値properties.AfterPropertiesを取得し、新しい値を取得する必要があることがわかりました。

エラーメッセージはユーザーにはひどく見えますが:エラー

私は今これを解決しようとします:)

于 2013-09-13T12:41:22.197 に答える