Como guardar propriedades em objectos SPWeb no SharePoint

Alguns programadores desconhecem a possibilidade de guardar propriedades em objectos SPWeb. É usualmente referida como property bag e é útil para guardar variáveis de configuração.

Se inspecionarem um objecto SPWeb vão reparar numa propriedade chamada AllProperties. "Óptimo", pensam vocês, mas depois continuam a inspecionar e descobrem outra propriedade: Properties. "Qual usar?", perguntam. A resposta é simples: ambas.

Properties é do tipo SPPropertyBag e foi deixada apenas por razões de compatibilidade. AllProperties foi implementada mais tarde como substituta e é um objecto Hashtable. Properties apenas contém um subconjunto do que está guardado em AllProperties.

Para evitar inconsistências devem escrever para ambas da seguinte maneira:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(SPContext.Current.Site.ID))
    {
        using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
        {
            web.AllowUnsafeUpdates = true;
            web.Properties[key] = value;
            web.AllProperties[key] = value;
            web.Update();
            web.Properties.Update();
            web.AllowUnsafeUpdates = false;
        }
    }
});

Que código tão feio para uma coisa tão simples. Infelizmente, a chamada a RunWithElevatedPrivileges e o uso de AllowUnsafeUpdates são necessários para isto funcionar. Para irem buscar uma entrada devem usar AllProperties.

Aconselho a colocarem isto numa classe utilitária com métodos para adicionar, actualizar ou remover propriedades.

Estão limitados a strings, mas obviamente que podem fazer parse a boleanos, inteiros ou mesmo objectos serializados (por exemplo para JSON podem usar To and FromJson Extension Methods).

Recursos

Nuno Freitas
Publicado por Nuno Freitas em 11 novembro, 2013

Artigos relacionados