Pergunta

Eu tenho um item receptor que implementa ItemUpdated() para processar um item depois de ter sido enviado para uma biblioteca de documentos.Tudo funciona bem, se eu adicionar documentos ao padrão de biblioteca "Documentos Compartilhados" - quando um novo documento for adicionado, ItemUpdated() é acionado normalmente.No entanto, se eu criar uma nova biblioteca de documentos no mesmo conjunto de sites, ItemUpdated() não é acionado quando eu carregar um novo documento para ele.Mas quando eu envio outra versão, ou mudar o nome do documento, etc., ItemUpdated() é acionado normalmente - isso simplesmente não é acionado no item upload.Exemplo típico:

  • Eu envio "doc1" para biblioteca de documentos - ItemUpdated() não executar (mas não executar se a biblioteca de documentos "Documentos Compartilhados");
  • Eu o upload de uma outra versão de "doc1' - ItemUpdated() executa como o esperado;
  • Eu renomear 'doc1' - ItemUpdated() executa como esperado.

Eu era levado a acreditar que a ordem dos eventos quando a adição de um documento normalmente é:

adicionando - acrescentou - atualizando - atualizado

Então, por que é meu ItemUpdated() não ficar acionado para bibliotecas que "Documentos Compartilhados"?Existe alguma configuração que pode estar causando isso?

Note que, por várias razões, eu não posso fazer o processamento dentro de ItemAdded().

Elements.xml:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="101">
    <Receiver>
      <Name>MyEventReceiverItemUpdated</Name>
      <Type>ItemUpdated</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>MyProject.MyEventReceiver.MyEventReceiver</Class>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>

Código:

public class MyEventReceiver : SPItemEventReceiver
{
    // On document upload, this method is only entered if I upload to "Shared Documents"
    public override void ItemUpdated(SPItemEventProperties properties)
    {               
        base.ItemUpdated(properties); // doesn't get called either
        MyMethod(properties);
    }
}
Foi útil?

Solução 2

Parece que eu tenho encontrado uma solução.Eu implementado ItemAdded() além original ItemUpdated() no caso do receptor.Por dentro, eu forçar uma chamada subseqüente para ItemUpdated() como esta:

public override void ItemAdded(SPItemEventProperties properties)
{            
    base.ItemAdded(properties);
    properties.ListItem.UpdateOverwriteVersion();            
}

Note que UpdateOverwriteVersion "atualizações de item, sem a criação de uma outra versão do item" (MSDN).Isso resulta em uma chamada para ItemUpdated() quando um novo item é adicionado;além disso, ela não cria uma nova versão do item (por exemplo,você não acaba com 2 versões quando você adicionar um novo item).Até agora, isso funciona como esperado para todas as bibliotecas de documentos, com e sem controle de versão.

Outras dicas

Você tem colunas adicionais em uma biblioteca ou de outro?Parece que faz uma diferença, em termos de se ItemUpdating() incêndios em carregar.Ter um olhar para este post.A frase chave, não é,

"os eventos que são disparados durante quando um documento é Adicionado a um Biblioteca de documentos PODEM incluir ItemUpdating e ItemUpdated.Mas só se existem campos adicionais incluídos no processo."

Então você pode querer brincar com diferentes configurações de biblioteca em seu ambiente para que você possa entender melhor como esse "recurso" do SharePoint impactos do sistema.

Além disso, eu posso compreender que pode haver razões para evitar ItemAdded.Se ItemUpdated continua a ser um problema para você, e você estaria disposta a compartilhar alguns detalhes sobre o porquê de ItemAdded é indesejável em seu ambiente, considere a possibilidade de pedir uma pergunta separada aqui sobre como fazer ItemAdded funcionar no seu sistema.

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top