2

私はSharepointを初めて使用します。ItemUpdated イベントにフックされた EventReceiver があり、フィールドにテキストを書き込みたいと考えています。ファイルをアップロードすると、イベントが正常にトリガーされ、デバッグ時にコードが実行され、更新されたように見えますが、プロパティが想定されているテキストを受け取りません。ただし、ページを更新すると、更新された値が表示されます。

これが私のコードです

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

        string folderPath = string.Empty;
        SPListItem item = properties.ListItem;
        if (item.File.ParentFolder != null)
        {
            folderPath = item.File.ParentFolder.ServerRelativeUrl;
        }

        AssignPropertyToField("Folder Name", item, folderPath);
    }        

    private void AssignPropertyToField(string fieldName, SPListItem item, string folderPath)
    {
        item[fieldName] = folderPath;

        this.EventFiringEnabled = false;
        item.SystemUpdate();
        this.EventFiringEnabled = true;
    }

提案を事前にありがとう、

よろしく、

4

3 に答える 3

3

可能であれば、ItemUpdatedの代わりにItemUpdatingを試してください。

ItemUpdated は非同期であるため、ページが更新される前に呼び出されるとは考えないでください。ItemUpdating では、リスト アイテムがまだ保存されていないため、SystemUpdateを呼び出す必要がないことに注意してください。

public override void ItemUpdating(SPItemEventProperties properties)
{
    string folderPath = string.Empty;
    SPListItem item = properties.ListItem;
    if (item.File.ParentFolder != null)
    {
        folderPath = item.File.ParentFolder.ServerRelativeUrl;
    }
    properties.AfterProperties["FolderNameInternalName"] = folderPath;
}        

あなたの場合、ItemUpdating イベント内で更新された親フォルダー情報を取得できるかどうかが問題になります。上記のサンプル コードは、以前に存在したフォルダー情報を取得します。ファイルが別のフォルダーに移動されている場合、このコードは間違った URL を提供します。

于 2012-05-16T12:06:29.603 に答える
1

item.SystemUpdate() の代わりに item.Update() を呼び出すことができます

この方法では、ItemUpdated イベント ハンドラーが 2 回呼び出されることに注意してください。したがって、item[fieldName] が AssignPropertyToField の folderPath と異なる場合にのみ更新を実行して、無限ループを回避する必要があります。

于 2012-05-15T18:02:44.360 に答える
0

できることは、ItemUpdatedレシーバーの定義のelements.xmlで、同期して実行する必要があることを定義することです。このhttp://msdn.microsoft.com/en-us/library/ff512765.aspxを参照してください

于 2012-05-16T13:24:54.763 に答える