SharePoint 2010은 Event Receiver를 사용하여 폴더를 자동으로 approved 상태로 만듭니다(2)

2300 단어 SharePoint
다음으로 ItemUpdated 코드를 붙여 보겠습니다.
		base.ItemUpdated(properties);



                if (properties.ListItem.FileSystemObjectType != SPFileSystemObjectType.Folder)

                    return;



                if (properties.ListItem.ModerationInformation.Status == SPModerationStatusType.Approved)

                    return;



                SPSecurity.RunWithElevatedPrivileges(delegate

                {

                    SPListItem item = properties.ListItem;

                    SPModerationInformation approverInfo = item.ModerationInformation;

                    if (approverInfo != null)

                    {

                        if (approverInfo.Status != SPModerationStatusType.Approved)

                        {

                            approverInfo.Status = SPModerationStatusType.Approved;

                            try

                            {

                                this.EventFiringEnabled = false;

                                item.Update();

                            }

                            finally

                            {

                                this.EventFiringEnabled = false;

                            }

                        }

                    }

                });

코드에서 주의해야 할 점은 이벤트FiringEnabled 속성을 호출한 것이다. ItemUpdated 이벤트가 반복적으로 터치되는 것을 방지하는 역할을 하기 때문에 다른 것은 잘 이해된다.이 코드를 환경에 배치하면 폴더 이름을 수정한 후에도 폴더의 상태는draft상태이고, 디버그 코드는item로 실행되는 것을 발견할 수 있습니다.Update () 이 줄에서 item을 찾을 수 없음을 알립니다!이유가 뭘까요?
먼저 ItemAdded, ItemUpdated는 글자 그대로 이해하지만, 대상이 추가된 후와 업데이트된 후에야 이 코드를 실행합니다. 모두 비동기적으로 실행될 때 폴더가 이름을 수정하면 버전이 업데이트됩니다. 그러나 코드에서 가져온 것은 이름을 수정하기 전의 버전입니다. 그러면 이 item을 찾을 수 없고 ItemAddeded는 버전 문제가 없습니다.
해결 방법은 Event Receiver의 elements입니다.xml에서 이 이벤트를 동기화 이벤트로 강제로 전환합니다.
    <Receiver>

      <Name>EventReceiver2ItemUpdated</Name>

      <Type>ItemUpdated</Type>

      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>

      <Class>AutoApproveFolder.EventReceiver2.EventReceiver2</Class>

      <SequenceNumber>10000</SequenceNumber>

      <Synchronization>Synchronous</Synchronization>

    </Receiver>

 
 

좋은 웹페이지 즐겨찾기