在ItemUpdate中设置SPListItem字段不会与SystemUpdate一起保留(false)

时间:2012-02-23 01:16:53

标签: c# sharepoint-2010 splistitem

我有一个自定义列表定义,其中包含一个覆盖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,而不是从属性中更新项目。
  • 设置properties.AfterProperties [“已发布?”]字段。

1 个答案:

答案 0 :(得分:2)

您不应在同步事件中调用系统更新。没有添加其他版本的活动。

如果要在更新之前更新属性,可以更改afterProperties [“”],如果更新成功,更改将保持不变。

base.ItemUpdating(properties);
properties.AfterProperties["Is Published"] = true;

顺便说一句,您还可以使用检索发布状态 ListItem.ModerationInformation.Status == SPModerationStatusType.Approved(=已发布并获得批准)

依靠ootb内部字段将确保您不必混淆其他事件接收器(注意内容部署正在运行时的有趣内容......)并确保状态始终为向上的更新。

希望它有所帮助。