我有一个自定义列表定义,其中包含一个覆盖ItemUpdating的事件接收器。该列表已启用内容审批,以及创建主要版本和次要版本。
如果项目被批准,我想设置一个布尔字段(已发布?)而不影响版本和批准状态。我理解 SystemUpdate(false)是这样做的,但它不会保留bool值。如果我使用更新()或 SystemUpdate(),则该值会保留,但不会将审批状态设置为已批准并抛出以下错误:
[日期]上[用户]修改了文件[文件名]。
public override void ItemUpdating(SPItemEventProperties properties)
{
base.ItemUpdating(properties);
EventFiringEnabled = false;
try
{
if (IsChangingToApproved(properties))
{
if (!Validate(properties))
{// This person can't approve
properties.ErrorMessage = "You don't have appropriate permissions.";
properties.Status = SPEventReceiverStatus.CancelWithError;
properties.Cancel = true;
}
else
{// Set the IsPublished flag to true
var isPublishedField = properties.List.Fields["Is Published?"];
if (isPublishedField != null)
{
properties.ListItem[isPublishedField.InternalName] = true;
// Doesn't update bool, ItemUpdating event functions normally
properties.ListItem.SystemUpdate(false);
// Updates bool, but ItemUpdating event does not complete
//properties.ListItem.Update();
//properties.ListItem.SystemUpdate();
}
}
}
}
catch (Exception ex) { return; }
finally { EventFiringEnabled = true; }
}
我尝试过的事情:
using Site/using Web
块更新listItem,而不是从属性中更新项目。答案 0 :(得分:2)
您不应在同步事件中调用系统更新。没有添加其他版本的活动。
如果要在更新之前更新属性,可以更改afterProperties [“”],如果更新成功,更改将保持不变。
base.ItemUpdating(properties);
properties.AfterProperties["Is Published"] = true;
顺便说一句,您还可以使用检索发布状态
ListItem.ModerationInformation.Status == SPModerationStatusType.Approved
(=已发布并获得批准)
依靠ootb内部字段将确保您不必混淆其他事件接收器(注意内容部署正在运行时的有趣内容......)并确保状态始终为向上的更新。
希望它有所帮助。