2010-01-17 2 views
1

인사말,SharePoint : SPListItem을 복사 할 때 원본 ContentType을 대상에 적용

모든 문서 라이브러리에 적용 할 수있는 자체 ContentType 정의를 작성했습니다. 해당 항목이 사용자가 ContentType 정의가 아직 첨부되지 않은 문서 라이브러리로 복사 될 때 해당 ContentType을 통해 항목과 관련된 데이터를 보존하려고합니다.

분명히해야 할 일은 새 항목의 ItemAdding 또는 ItemUpdating 이벤트를 잡아 내 원본 항목을보고 내 ContentType이 연결되어 있는지 확인한 다음 대상에 내 ContentType을 추가하는 것입니다 실제로 복사하기 전에 문서 라이브러리.

문제는 소스 이벤트 항목이 무엇인지 알려주는 정보가없는 것입니다. 그러한 데이터는 마지막 ItemUpdated 이벤트에 있지만 그때까지는 너무 늦었습니다 ... 항목이 이미 복사되고 ContentType과 관련된 데이터가 삭제되었습니다.

누구나 내가 원하는 동작을 얻는 방법에 대한 아이디어가 있습니까?

TIA 어떤 도움이 필요하십니까?

스티브

PS : 나는 내가 할 수있는 추측 한 것은 ItemUpdated 이벤트의 소스 URL을 얻을, 다음의 ContentType을 추가하는 코드를 작성하고 수동으로 소스의 유형과 관련된 데이터를 이동하다 목적지까지. 이것은 내가 위에서 제안한 해결책에 비해서 매우 우아하지 않은 것처럼 보입니다.

답변

0

누군가가 내 문제에 대한 최고의 솔루션에 관심이 경우 그냥 후속 ...

:

  1. 내 코드를 ItemUpdated 이벤트 처리기로 이동하여 복사본이 완전히 발생한 후에 작동하도록했습니다.

  2. 내 ContentType이 대상이 소스에 있지만하지 있는지 확인하기 위해

  3. 봐 소스 항목의 URL을 가져옵니다 (이전에 대답 참조) 소스 SPList에 그 해결 SPListItem.

  4. ContentType이 대상에 없으면 대상에 ContentType을 설치하고 원본에서 대상으로 해당 ContentType의 속성을 ContentType 자체를 쿼리하여 수동으로 복사하십시오.

이 프로세스는 대상 lib에 복사 된 첫 번째 항목에 대해서만 발생합니다. 그런 다음 ContentType이 이미 dest lib에 있고 SP 자체가 소스에서 대상으로 해당 유형의 필드 값을 복사합니다.

0

나는 그것을 알아 냈다! 대답은 소스 URL이 ItemUpdating 이벤트 속성의 AfterProperties 필드에 있다는 것입니다. 이처럼 얻을 :이 필드에보고했지만, 보여줍니다 개체의 구성원이 있다는 사실에 의해 발생 된

properties.AfterProperties["_CopySource"]; 

디버거에서 "= 0를 계산합니다." 나는 거기에 아무 것도 없다는 것을 의미하는 것을 오해하지만, 그 수는 거기에 얼마나 많은 속성이 있는지와는 아무런 관련이 없다는 것이 밝혀졌습니다. Ooops.

불행히도, 내가 시도한 것은 여전히 ​​작동하지 않습니다. 내 ContentType을 ItemUpdating 이벤트의 대상 라이브러리에 추가하더라도 해당 유형과 관련된 필드는 복사되지 않습니다. ... 아 글쎄 내가 원하는 행동을 얻기 위해 무슨 짓을

관련 문제