none
Как узнать, что при редактировании пользователь добавил Attachment? RRS feed

  • Вопрос

  • Добрый день!

    Планирую сделать на Visual Studio C# рабочий процесс State Machine. При создании элемента списка будет уходить уведомление определенным лицам. При изменении элемента, только если был добавлен новый Attachment, то так же отправить уведомление.

    Как лучше определить, что был добавлен Attachment? Желательно с примерами.

    23 июня 2017 г. 6:08

Ответы

  • Добрый день,

    все зависит от задачи:

    1. Без уникальности - сравнивать текущее количество вложений с заранее сохраненным числом (в скрытом поле) - если больше, то вложение добавлено.

    SPAttachmentCollection collAttachments = item.Attachments;
    if (collAttachments.Count > oldCounts) sendEmail("добавлено вложение");

    2. Если с уникальностью имен -то обрабатывать названия файлов, вычислять хэш строки и сравнивать со старым значением:

    foreach (String attachmentname in item.Attachments)
    {
       StringForHash += attachmentname;
    }
    // вычисляем хеш
    var md5 = MD5(StringForHash);
    if (md5 != oldHash) sendEmail("Изменились вложения");
    // в таком случае любое изменение (добавление или удаление) вложений приводит к изменению хеша.

    P.s. Код просто для примера, написанный на коленке... Это вам направление деятельности, вариант реализации зависит от вас. Будут вопросы - обращайтесь.

    Алгоритм такой:

    1. При создании элемента запоминаем состояние вложений в скрытом поле (число, строка).

    2. При изменении - получаем текущее состояние и сравниваем со старым значением, если изменилось - сохраняем новое значение и рассылаем оповещения.

    Как то так...


    MS,MCTS,MCP,MCPD: SharePoint Developer 2010


    • Изменено Maxim Shusharin 23 июня 2017 г. 8:10
    • Помечено в качестве ответа agemlex77 23 июня 2017 г. 8:24
    23 июня 2017 г. 7:56
  • Спасибо!

    Да, почему то в Интернет именно такой способ предлагают в основном - через скрытое поле.

    Но я наверно всё же буду обрабатывать именно событие добавления вложения, мне кажется так надёжнее. Уже сделал тест, чтобы проверить работу кода.

    Вот ссылка на статью:

    https://msdn.microsoft.com/en-us/library/gg252010.aspx

    Только я вместо ItemAdding, использую ItemAttachmentAdded - срабатывает только тогда, когда я добавляю вложение.

    Есть один минус, пока не пойму почему, рабочий процесс в VisualStudio breakpoints ловит, а EventReceiver почему то нет. Ну да ладно, я для теста в поле пишу "test" чтобы проверить срабатывание. Сохраняю элемент без вложения - тестовое поле пусто. Захожу в элемент, вношу изменения, без добавления Attachment - - тестовое поле пусто. Добавляю attachment - поле заполняется словом "test".

    • Помечено в качестве ответа agemlex77 23 июня 2017 г. 8:24
    23 июня 2017 г. 8:24

Все ответы

  • Добрый день,

    все зависит от задачи:

    1. Без уникальности - сравнивать текущее количество вложений с заранее сохраненным числом (в скрытом поле) - если больше, то вложение добавлено.

    SPAttachmentCollection collAttachments = item.Attachments;
    if (collAttachments.Count > oldCounts) sendEmail("добавлено вложение");

    2. Если с уникальностью имен -то обрабатывать названия файлов, вычислять хэш строки и сравнивать со старым значением:

    foreach (String attachmentname in item.Attachments)
    {
       StringForHash += attachmentname;
    }
    // вычисляем хеш
    var md5 = MD5(StringForHash);
    if (md5 != oldHash) sendEmail("Изменились вложения");
    // в таком случае любое изменение (добавление или удаление) вложений приводит к изменению хеша.

    P.s. Код просто для примера, написанный на коленке... Это вам направление деятельности, вариант реализации зависит от вас. Будут вопросы - обращайтесь.

    Алгоритм такой:

    1. При создании элемента запоминаем состояние вложений в скрытом поле (число, строка).

    2. При изменении - получаем текущее состояние и сравниваем со старым значением, если изменилось - сохраняем новое значение и рассылаем оповещения.

    Как то так...


    MS,MCTS,MCP,MCPD: SharePoint Developer 2010


    • Изменено Maxim Shusharin 23 июня 2017 г. 8:10
    • Помечено в качестве ответа agemlex77 23 июня 2017 г. 8:24
    23 июня 2017 г. 7:56
  • Спасибо!

    Да, почему то в Интернет именно такой способ предлагают в основном - через скрытое поле.

    Но я наверно всё же буду обрабатывать именно событие добавления вложения, мне кажется так надёжнее. Уже сделал тест, чтобы проверить работу кода.

    Вот ссылка на статью:

    https://msdn.microsoft.com/en-us/library/gg252010.aspx

    Только я вместо ItemAdding, использую ItemAttachmentAdded - срабатывает только тогда, когда я добавляю вложение.

    Есть один минус, пока не пойму почему, рабочий процесс в VisualStudio breakpoints ловит, а EventReceiver почему то нет. Ну да ладно, я для теста в поле пишу "test" чтобы проверить срабатывание. Сохраняю элемент без вложения - тестовое поле пусто. Захожу в элемент, вношу изменения, без добавления Attachment - - тестовое поле пусто. Добавляю attachment - поле заполняется словом "test".

    • Помечено в качестве ответа agemlex77 23 июня 2017 г. 8:24
    23 июня 2017 г. 8:24
  • Я вам дал вариант решения для РП. В ресивере обрабатывать будет надежнее.

    Breakpoint'ы должны срабатывать...

    Почитать:

    Using Event Receivers in SharePoint Foundation 2010 (Part 1 of 2)

    Using Event Receivers in SharePoint Foundation 2010 (Part 2 of 2)


    MS,MCTS,MCP,MCPD: SharePoint Developer 2010

    23 июня 2017 г. 8:42