Невозможно обновить свойство документа для события ItemAdded при использовании Vista - PullRequest
2 голосов
/ 01 апреля 2009

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

Наше решение отлично работает, за исключением случаев, когда пользователь Vista пытается сохранить новый документ из Office 2007. В этом случае документ сохраняется в библиотеке документов, но столбец «Уникальный идентификатор» пуст и исключений нет. *

Vista. Пользователи могут загружать документы в библиотеку без проблем. Все остальное прекрасно работает в операционных системах XP и Win2k3.

Кто-нибудь видел нечто подобное, и в чем здесь может быть проблема? Чтобы продемонстрировать проблему, мы используем DateTime.Now в качестве уникального идентификатора.

 using Microsoft.SharePoint;

 public class TestReciever : SPItemEventReceiver
 {

     public override void ItemAdded(Microsoft.SharePoint.SPItemEventProperties properties)
     {

         try {
             DisableEventFiring();

             properties.ListItem("UniqueID Column") = DateTime.Now.ToString();
             properties.ListItem.SystemUpdate();

             EnableEventFiring();
         }
         catch (Exception ex) {
             // handle exception
         }


     }
 }

Ответы [ 3 ]

1 голос
/ 12 мая 2009

В конце мы связались с Microsoft, и они предоставили нам следующее решение. Ключевым моментом здесь является задержка обновления элемента в отдельном потоке.

private Guid listID;
private Guid itemID;
private Guid siteID;



public override void ItemAdded(Microsoft.SharePoint.SPItemEventProperties properties)
{
    DisableEventFiring();

    item = properties.ListItem;
    listID = properties.ListId;
    itemID = properties.ListItem.UniqueId;
    siteID = properties.SiteId;

    Threading.Thread setDocumentInternalIDThread = new Threading.Thread(SetInternalID);
    setDocumentInternalIDThread.Start();


    EnableEventFiring();
}


private void SetInternalID()
{
    try {

        Threading.Thread.Sleep(10000);
        using (SPSite site = new SPSite(siteID)) {
            using (SPWeb web = site.OpenWeb()) {

                SPList list = web.Lists(listID);
                SPListItem item = list.Items(itemID);

                item(Common.CustomID) = Common.GetAlphaPrefix() + Common.GetDocNumber();
                item.SystemUpdate();
            }

        }
    }
    catch (Exception ex) {

        Log(ex.Message);
    }
}
1 голос
/ 02 апреля 2009

Мы заметили, что происходит точно так же. Когда документ 2007 года добавляется в библиотеку, в него добавляются свойства из списка (пусто).

Затем вызывается (синхронный) обработчик событий, обновляя список правильными значениями для столбца UniqueID.

Затем включается встроенное свойство, сопоставленное с документами 2007 года, и перезаписывает ваши значения значениями, хранящимися в документе 2007 года (не вызывая событие обновления элемента снова).

Это означает, что в списке теперь есть пробел для вашего столбца.

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

Можно нарушить сопоставление свойств между списком и офисом, но это только обходной путь.

Я не могу на всю жизнь найти, где эта информация находится на сайте MS, но это известная проблема. Возможно, вы можете зависнуть там для SP2 (может быть даже исправлено в SP1, но я не уверен).

0 голосов
/ 04 июня 2009

Другой обходной путь - установить настраиваемое поле, которое обновляется в приемнике событий, только для чтения (установите для свойства fields ReadOnly значение TRUE). В этом есть несколько плюсов и минусов. Это идеально для решения с уникальным идентификатором, поскольку у пользователя нет возможности изменить значение. Однако поле скрыто для пользовательского интерфейса, поэтому управление им становится более трудоемким, и поле нельзя использовать в метках или быстрых частях. Можно установить для свойства ShowInDisplayForm поля значение ИСТИНА, чтобы поле отображалось в форме просмотра, но не в форме редактирования. Поле также может быть добавлено к вашим представлениям. Это лучший обходной путь, который я нашел для этой проблемы на сегодняшний день.

Это проблема Office 2007 и синтаксического анализатора WSS 3.0 xml. Когда свойства перемещаются из документа Office 2007, анализатор пытается назначить свойства документа свойствам списка в SharePoint (повышение свойств). Проблема заключается в том, что это событие возникает после любых событий ItemAdded или ItemUpdated, поэтому свойство перезаписывается значением в документе, которое, конечно, пусто. Microsoft подняла это как ошибку, и я надеялся на исправление в SP2, но не такая удача.

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