Aqui vão algumas dicas no desenvolvimento de handlers de sharepoint:
- Um event handler relativamente a items, usa as permissões do utilizador que o submete.
Terá de se ter cuidado, pois esta situação representa um enorme factor de bugs/problemas. Em caso de se manipular informação não acessivel a todos os utilizadores, fazer impersonate. Ver http://dotnetjunkies.com/WebLog/victorv/archive/category/2032.aspx .
- Existe uma enorme confusão relativamente às propriedades After e BeforeProperties.
Nos testes efectuados estas propriedades não apareciam preenchidas no evento ItemUpdated, logo não tinha forma de obter valores anteriores ao update. A solução passa por escrever em properties.AfterProperties (properties.BeforeProperties é read only) os dados desejados no evento ItemUpdating.
properties.AfterProperties["xpto"] = properties.ListItem["xpto"]
Assim em ItemUpdated, poderemos sempre obter o "estado anterior" do item.
- Para criar/editar as permissões de qualquer item submetido, dá imenso jeito usar o objecto Contact (Microsoft.Office.Workflow.Utility). O mesmo poderá ser criado usando o seguinte método estático Contact.FromName(contactName, site).
internal static void SetPermissions(SPWeb web, ref SPListItem listItem, IList<Contact> itemUsers, SPRoleType roleType)
{
if (itemUsers != null && itemUsers.Count > 0)
{
//Get Role Definition from SPWeb
SPRoleDefinition roleDefinition = web.RoleDefinitions.GetByType(roleType);
foreach (Contact contact in itemUsers)
{
SPRoleAssignment roleAssignment = new SPRoleAssignment(contact.LoginName,
contact.EmailAddress,
contact.DisplayName,
null);
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
listItem.RoleAssignments.Add(roleAssignment);
}
}
}