Как скопировать недавно добавленный документ с метаданными в другую библиотеку документов? - PullRequest
1 голос
/ 02 апреля 2010
  1. Мне нужно скопировать элемент, который только что добавил пользователь (например, myresume.doc или financial.xls) с метаданными (doc lib получает столбцы из типа контента, ct получает столбцы из столбца сайта) и скопируйте элемент с метаданными в папку с именем «NativeFile». В каждой библиотеке документов есть эта папка.

  2. Я знаю, что itemadded можно использовать, но потом я услышал выстрелы itemadded, прежде чем у пользователя была возможность заполнить метаданные для элемента, который они только что добавили.

Какие у меня варианты? (плохо знаком с sp, так что некоторые примеры кода очень помогли бы. Или хорошая ссылка, похожая на эту проблему)

Sharepoint 2007, с добавлением итераций, или с добавлением элементов, или с обновлением элементов ...

Ответы [ 3 ]

1 голос
/ 02 апреля 2010

Комет правильный. С одними только получателями событий элемента нет хорошего способа дублировать метаданные. Если вы можете просто скопировать файл, сделайте вот что:

public class MyItemEventReceiver : SPItemEventReceiver
{
    public override void ItemAdded(SPItemEventProperties properties)
    {
        base.ItemAdded(properties);

        SPListItem item = properties.ListItem;
        item.File.CopyTo(item.ParentList.RootFolder.Name + "/NativeFile/" + item.File.Name, true);
    }
}
0 голосов
/ 06 апреля 2010

Простое копирование коллекции Properties из исходного элемента в целевой элемент не работает для всех типов файлов, особенно если они находятся в разных библиотеках документов.

См. Эту тему для более подробной информации: https://sharepoint.stackexchange.com/questions/1151/what-is-the-best-way-to-copy-a-files-column-data-in-sharepoint

0 голосов
/ 02 апреля 2010

То, что вы слышали правильно: ItemAdded будет срабатывать до завершения метаданных, потому что в библиотеке документов ItemAdded срабатывает при первой загрузке документа, а не при заполнении формы.

Я думаю, что наиболее плавным вариантом является использование рабочего процесса, который запускается при создании элемента в библиотеке документов. В частности, на основе кода с использованием Visual Studio 2008, если он у вас есть. Общее пошаговое руководство по созданию рабочих процессов с использованием Visual Studio 2008 можно найти здесь: Обработка рабочих процессов SharePoint с помощью Visual Studio . Из этой статьи я узнал, в первую очередь, как создавать рабочие процессы, поэтому я надеюсь, что она поможет вам так же, как и мне. Я бы рекомендовал этот подход поверх обработчика событий, потому что вам нужно будет использовать ItemUpdated, что означает, что вам придется выполнять хитрые проверки, чтобы убедиться, что это выполняется только один раз. И другой вариант, который я могу придумать, это создание нестандартной формы, не очень удобно делать все время.

Теперь создайте свой собственный рабочий процесс. Обязательно инициализируйте свойства workflowProperties, как показано в ссылке для onWorkflowActivation_Invoked. Это очень простой рабочий процесс, если вы заполните все обязательные поля в форме. В представлении конструктора все, что вам нужно, - это 2 дополнительных действия, кроме действия OnWorkflowActivation: действие OnWorkflowItemChanged и действие кода. Для действия OnWorkflowItemChanged единственное свойство, которое необходимо установить, - это CorrelationToken, который будет таким же, как CorrelationToken действия OnWorkflowActivation. Теперь дважды щелкните действие Code, чтобы сгенерировать его метод codeActivity_Executed. В этом методе должно быть достаточно следующего:

SPListItem item = workflowProperties.Item;

if (!item.File.Url.Contains("/NativeUrl/"))

{

string destination = item.ParentList.RootFolder.Name + "/NativeFile/" + item.File.Name;

item.File.CopyTo(destination, true);

}

Я добавил оператор if, потому что рабочий процесс, вероятно, будет запускаться для нового элемента, созданного с помощью CopyTo, поэтому он проверит, находится ли файл в папке, и если он есть, он не будет выполнять копия. Теперь свяжите рабочий процесс с вашим сайтом, как показано в ссылке, и свяжите его с созданием элемента. Тогда должно сработать.

Несмотря на то, что этот рабочий процесс технически ожидает ItemUpdated, поскольку именно тогда поля заполняются, связывая его с созданием элемента, вы гарантируете, что он запускается только один раз. Я признаю, что использовал только item.File.MoveTo(destination, true), но при этом сохраняются все поля и метаданные, так что я уверен, что CopyTo также должен. Если нет, просто закричите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...