我是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;
}
提前感谢您的建议,
此致
答案 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