связать 1 приемник событий с 2 ​​библиотеками документов

У меня есть приемник обновленных событий, который я хотел бы связать только с двумя библиотеками документов.

Раньше я связывал приемник событий с ListTemplateId="101". Итак, этот приемник событий срабатывал для всех библиотек документов! чего я не хотел, но я не смог избежать этого чисто. Поэтому в качестве обходного пути в первой строке кода я проверяю библиотеку, в которой вызывается приемник событий, и возвращаюсь, если это не была предполагаемая библиотека.

Затем я немного почитал о тегах receivers в elements.xml и обнаружил, что могу зарегистрировать несколько тегов receivers в elements.xml. Итак, я изменил elements.xml, как показано ниже.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListUrl="DocLib1">
    <Receiver>
      <Name>EventReceiver1ItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>NM1.EventReceiver1.EventReceiver1</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>
  <Receivers ListUrl="DocLib2">
    <Receiver>
      <Name>EventReceiver1ItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>NM1.EventReceiver1.EventReceiver1</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>
</Elements>

Надеясь, что приемник событий будет связан только с этими двумя библиотеками документов. Но дело в том, что приемник событий привязывается только к DocLib1 (первые приемники в elements.xml)

Может ли кто-нибудь указать мне, возможно ли то, чего я пытаюсь достичь, с подходом, которому я следую, или мне следует изменить свой подход?

Спасибо

Амар


person Amar    schedule 21.09.2017    source источник


Ответы (2)


Хороший ответ на эту проблему есть здесь.

Но другим быстрым и грязным решением было бы вернуть ваш elements.xml к использованию ListTemplateId="101" в одном элементе Receiver и обернуть вашу логику следующим образом:

if(properties.ListTitle == "List1" || properties.ListTitle == "List2")
{
    // Your logic here.
}
person DevBot    schedule 21.09.2017
comment
Это существующее приложение, библиотеки документов уже содержат большое количество данных. Мне не слишком удобно играть с ними в продакшене. Что касается второго решения, которое вы предложили, я его уже реализовал (Поэтому в качестве обходного пути в первой строке кода я проверяю библиотеку, в которой вызывается приемник событий, и возвращаюсь, если это не была предполагаемая библиотека.< /б>). - person Amar; 22.09.2017

Я изо всех сил пытался добиться этого с помощью elements.xml, но не смог в свое время, поэтому я прибегнул к использованию кода события активации функции.

Я изменил файл elements.xml, чтобы не связывать это событие ни с чем

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers>
    <Receiver>
      <Name>EventReceiver1ItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>NM1.EventReceiver1.EventReceiver1</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>      
</Elements>

А затем, прикрепив событие к моей функции, я изменил событие FeatureActivated и написал что-то вроде этого

public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;
            using (SPWeb web = site.RootWeb)
            {
                web.Lists["DoocLib1"].EventReceivers.Add(SPEventReceiverType.ItemAdded, Assembly.GetExecutingAssembly().FullName, "NM1.EventReceiver1.EventReceiver1");
                web.Lists["DoocLib2"].EventReceivers.Add(SPEventReceiverType.ItemAdded, Assembly.GetExecutingAssembly().FullName, "NM1.EventReceiver1.EventReceiver1");

            }
        }

Обратите внимание: чтобы эта функция работала, она должна быть ограничена как минимум сайтом.

Я буду продолжать изучать способы достижения этого с помощью elements.xml и опубликую его, когда у меня будет решение.

Спасибо

Амар

person Amar    schedule 22.09.2017