2010-08-31 4 views
2

Je n'arrive pas à mettre à jour un attribut SharePoint publishingWeb sous RunWithElevatedPrivileges. il échoue avec l'exception "La validation de sécurité pour cette page est invalide" sur cette ligne: "pubWeb.IncludeInCurrentNavigation = false;". Voici le code que j'essaie de lancer. Normalement vous pouvez définir AllowUnsafeUpdates = true, mais publishWeb n'a pas cette propriété spéciale.SharePoint PublishingLe changement de Web dans un contexte de sécurité élevé échoue, pourquoi?

Ma question est quelle est la bonne façon de mettre à jour les attributs publishingWeb dans un contexte élevé?

  SPSecurity.RunWithElevatedPrivileges(delegate() 
      { 
       using (SPSite siteCollection = new SPSite(parentSiteUrl)) 
       { 
        //siteCollection.AllowUnsafeUpdates = true; 
        using (SPWeb web = siteCollection.OpenWeb(subSiteUrl)) 
        { 
         //web.AllowUnsafeUpdates = true; 
         if (PublishingWeb.IsPublishingWeb(web)) 
         { 
          // hide new sub-site from navigation elements. 
          PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web); 
          pubWeb.IncludeInCurrentNavigation = false; 
          pubWeb.IncludeInGlobalNavigation = false; 
          pubWeb.Update(); 
         } 
        } 
       } 
      }); 
+0

Où votre code est-il exécuté? récepteur de fonction? partie Web? –

+0

Il s'exécute dans un contrôle utilisateur, qui est cuit dans une mise en page. – James

Répondre

1

Si ce changement se produit sur un postback (POST), vous devrait appeler SPSecurity.ValidateFormDigest() avant de faire le changement. AllowUnsafeUpdates est uniquement utilisé pour les requêtes http GET.

S'il s'agit d'une requête GET, je m'attendrais à ce que la ligne commentée ait fonctionné, mais étant donné qu'elle a été commentée, je suppose qu'elle ne l'a pas été. Je vous suggère d'utiliser:

pubWeb.Web.AllowUnsafeUpdates = true 

comme PublishingWeb est une enveloppe pour une instance SPWeb, qui est accessible via la propriété Web. Il est étrange que, je me serais attendu à la fourni SPWeb avoir été la même instance (et en tant que telle votre ligne commentée aurait travaillé.)

+0

Cette action est en cours de publication. Étant donné que dois-je combiner SPSecurity.ValidateFormDigest() avec pubWeb.Web.AllowUnsafeUpdates = true pour que cela fonctionne? – James

+0

Non. ValidateFormDigest est pour POST, AllowUnsafeUpdate est pour GET. Le point de la forme de résumé est qu'il garde la page inviolable et "sûr". Une requête get est considérée comme non sûre car il est facile de modifier la chaîne de requête qui peut être utilisée dans les appels de méthodes sensibles. Si vous constatez que vous faites les mêmes changements dans POST et GET, alors revisitez votre conception. Vous devriez vous efforcer de POST seulement. – x0n

+0

Étant donné que ces actions sont en post-publication uniquement, "SPSecurity.ValidateFormDigest()" doit-il être placé dans le bloc RunWithElevatedPrivileges ou à l'extérieur? – James

1

un peu a lu sur l'utilisation de cette propriété

pubWeb.Navigation. ExcludeFromNavigation (true, web.ID);

au lieu de

pubWeb.IncludeInCurrentNavigation = false;

pubWeb.IncludeInGlobalNavigation = false;

Vous ne savez pas si cela est pertinent par rapport à ce que vous essayez d'accomplir.

SPSecurity.RunWithElevatedPrivileges(delegate() 
       { 
        using (SPSite siteCollection = new SPSite(parentSiteUrl)) 
        { 
         //siteCollection.AllowUnsafeUpdates = true; 
         using (SPWeb web = siteCollection.OpenWeb(subSiteUrl)) 
         { 
          //web.AllowUnsafeUpdates = true; 
          if (PublishingWeb.IsPublishingWeb(web)) 
          { 
           // hide new sub-site from navigation elements. 
           PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web); 
           pubWeb.Navigation.ExcludeFromNavigation(true, web.ID); 
           pubWeb.Update(); 
          } 
         } 
        } 
       }); 
Questions connexes