SharePoint 2010 переименовать документ при неудачной загрузке в представлении Explorer - PullRequest
1 голос
/ 19 октября 2011

Я пытаюсь реализовать настройку в SharePoint 2010, чтобы при загрузке документа в библиотеку имя файла изменялось, чтобы в него входил идентификатор документа. (Я знаю, что людям больше не нужно беспокоиться об именах файлов, но у нас уже есть много устаревших файлов и пользователей, которым нравится иметь локальные копии).

Мне удалось реализовать специальный приемник событий для события ItemAdded, которое переименовывает файл, добавляя идентификатор документа перед именем файла. Это работает правильно из Интернета Загрузить.

Проблема с Обозревателем. Когда я пытаюсь добавить файл с помощью WebDAV в окне просмотра, я получаю две копии файла. Кажется, что когда файл загружается через Интернет, события, которые запускаются,

  1. ItemAdding
  2. ItemAdded

Но когда я копирую / вставляю файл в Проводник, я вижу следующие события:

  1. ItemAdding
  2. ItemAdded
  3. ItemAdding
  4. ItemAdded
  5. ItemUpdating
  6. ItemUpdated

В результате у меня есть два файла с разными именами (поскольку идентификаторы документов разные).

Я нашел много людей, обсуждающих эту проблему в Интернете ( эта - лучшая статья, которую я нашел). У кого-нибудь есть другие идеи? Будет ли больше смысла делать это в рабочем процессе, а не в получателе событий? Вместо этого я мог бы использовать запланированное задание, но это могло бы сбить пользователя с толку, если имя документа изменилось несколько минут спустя.

Это мой код, который отлично работает при загрузке через Интернет, но не при использовании Explorer View:

public override void ItemAdded(SPItemEventProperties properties)
{
   try
   {
       SPListItem currentItem = properties.ListItem;

       if (currentItem["_dlc_DocId"] != null)
       {
       string docId = currentItem["_dlc_DocId"].ToString();
       if (!currentItem["BaseName"].ToString().StartsWith(docId))
       {
           EventFiringEnabled = false;
           currentItem["BaseName"] = docId + currentItem["BaseName"];
           currentItem.SystemUpdate();
           EventFiringEnabled = true;
       }
       }
   }
   catch (Exception ex)
   {
       //Probably should log an error here
   }            
   base.ItemAdded(properties);
}

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Я обнаружил, что использование рабочего процесса Visual Studio позволяет мне максимально гибко это делать. Рабочий процесс конструктора SharePoint будет проще, но его будет сложнее развернуть на разных сайтах и ​​в библиотеках.

Прочитав несколько хороших статей, включая , и , , я пришел к этому коду, который, кажется, работает Он запускает рабочий процесс и ждет, пока документ не окажется в LockState, а затем обрабатывает имя файла.

Рабочий процесс выглядит так:

Workflow image

А вот код:

namespace ControlledDocuments.RenameWorkflow
{
    public sealed partial class RenameWorkflow : SequentialWorkflowActivity
    {
        public RenameWorkflow()
        {
            InitializeComponent();
        }

        public Guid workflowId = default(System.Guid);
        public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties();

        Boolean continueWaiting = true;


        private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
        {
            CheckFileStatus();
        }

        private void whileActivity(object sender, ConditionalEventArgs e)
        {
            e.Result = continueWaiting;
        }

        private void onWorkflowItemChanged(object sender, ExternalDataEventArgs e)
        {
            CheckFileStatus();
        }

        private void CheckFileStatus()
        {
            if (workflowProperties.Item.File.LockType == SPFile.SPLockType.None)
            {
                continueWaiting = false;
            }
        }

        private void renameFile(object sender, EventArgs e)
        {
            try
            {
                SPListItem currentItem = workflowProperties.Item;

                if (currentItem["_dlc_DocId"] != null)
                {
                    string docId = currentItem["_dlc_DocId"].ToString();
                    if (!currentItem["BaseName"].ToString().StartsWith(docId))
                    {
                        currentItem["BaseName"] = docId + currentItem["BaseName"];
                        currentItem.SystemUpdate();
                    }
                }
            }
            catch (Exception ex)
            {
                //Should do something useful here
            }
        }

    }
}

Надеюсь, это поможет кому-то еще, если у него возникнет та же проблема.

2 голосов
/ 20 октября 2011

Ну, я бы пошел на обход рабочего процесса ... Есть 2 варианта IMO:

1) Создайте логическое значение в вашей библиотеке документов, затем создайте рабочий процесс SPD, который запускается при добавлении элемента, и установите для этого поля значение «Изменено» или что-то в этом роде. Затем в EventReceiver вы проверяете, установлено ли это поле ..

2) Сделайте все с помощью рабочего процесса SPD - смена заголовка, как в этом примере, не должна быть проблемой.

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