Operation is not valid due to the current state of the objec

Informação sobre SharePoint 2007, SharePoint 2010, WSS 3.
Dúvidas sobre a plataforma, best practices, erros comuns, etc..
 

Operation is not valid due to the current state of the objec

Mensagempor zecarlos » Terça, 18:01, 28 Jul 2009

Operation is not valid due to the current state of the object

Olá, deparei-me com este erro ao tentar ler um item de uma lista de SharePoint.
O códio que estou a utilizar é o seguinte:

Código: Seleccionar Todos
SPSecurity.RunWithElevatedPrivileges(
delegate()
{
     using (SPSite site = new SPSite(SPContext.Current.Site.ID))
     using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))

     string ItemID = web.Lists["myList"].Items[0]["ItemID"].ToString();
}
);


O que é mais interessante é que às vezes este código funciona, e depois falha.

Alguém me pode ajudar?
zecarlos
 
Mensagens: 24
Registado: Terça, 00:49, 21 Abr 2009

 

Re: Operation is not valid due to the current state of the objec

Mensagempor ndocosta » Terça, 18:08, 28 Jul 2009

Olá,

o erro que reportas é bastante comum quando desenvolvemos sites em SharePoint.
O Problema está relacionado com a obtenção do contexto do SharePoint.

Repara, se colocarmos o endereço do site em vez de irmos pelo contexto actual (SPContext.Current), o erro desaparece:

Código: Seleccionar Todos
SPSecurity.RunWithElevatedPrivileges(
delegate()
{
      using (SPSite site = new SPSite(http://server/))
      using (SPWeb web = site.OpenWeb("myweb"))

      string ItemID = web.Lists["myList"].Items[0]["ItemID"].ToString();

}

);


É óbvio que em produção não podemos deixar o endereço do site Hardcoded.

Para não obteres este erro, deves efectuar um refactoring do teu código, escrevendo-o de outra maneira:

Código: Seleccionar Todos
SPWeb  webContext = null; //declare webContext out side the try ... catch and assign "null"

try
{
     webContext = SPContext.Current.Web; // Assign SPContext to the webContext

    SPSecurity.RunWithElevatedPrivileges(
    delegate()
   {
        using (SPSite site = new SPSite(webContext.Site.ID))
        using (SPWeb web = site.OpenWeb(webContext.ID))

        string ItemID = web.Lists["myList"].Items[0]["ItemID"].ToString();
   }
);
}
catch (Exception ex)
{
}
finally
{
    if (webContext != null)
         webContext.Dispose();
}


Com este código, o erro desaparece. Repara que declarámos o webContext fora do try...catch e apenas utilizamos o SPContext uma vez e fora do using.
Não esquecer de fazer dispose do objecto criado, senão teremos problemas de memória no servidor.

Espero ter ajudado. :)
Imagem
ndocosta
Administrador do Site
 
Mensagens: 24
Registado: Sexta, 23:21, 17 Abr 2009

 

Voltar para SharePoint

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante

cron
web counter