ListItem值仅在点击刷新后才在ItemUpdated上更新

时间:2012-05-15 16:35:21

标签: sharepoint listitem event-receiver

我是Sharepoint的新手。 我有一个EventReceiver挂钩到ItemUpdated事件,我想在一个字段中写一个文本。 当我上传文件时,事件触发正常,它通过调试代码,似乎更新但我的属性没有收到它应该的文本。但是,当我点击页面上的刷新后,我可以看到更新的值。

这是我的代码

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

提前感谢您的建议,

此致

3 个答案:

答案 0 :(得分:3)

如果可能,请尝试ItemUpdating而不是ItemUpdated

由于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。

答案 1 :(得分:1)

您可以调用item.Update()而不是item.SystemUpdate()

请注意,这样ItemUpdated事件处理程序将被调用两次,因此如果item [fieldName]与AssignPropertyToField中的folderPath不同,则需要确保只进行更新,以避免无限循环。

答案 2 :(得分:0)

您可以做的是,在ItemUpdated接收器的定义中的elements.xml中定义它应该运行同步。见http://msdn.microsoft.com/en-us/library/ff512765.aspx