0

J'ai un site de publication construit avec MOSS 2007 et j'ai besoin d'obtenir le contenu de la page par programmation. Je sais que je peux utiliser WebClient pour envoyer une requête à la page, puis analyser le texte de la réponse. Mais je veux le faire dans le modèle SharePoint puisque l'échelle est grande.Comment faire pour rendre par programme DataFormWebPart?

Les parties Web que je veux représenter sont DataFormWebPart et elles s'affichent correctement si elles sont affichées dans un navigateur. Mais je reçois des exceptions en essayant de les rendre par programmation.

Le code:

var partMgr = siteCollection.RootWeb.GetLimitedWebPartManager(pageUrl, PersonalizationScope.Shared); 

var sr = new StreamWriter(@"d:\temp\test.txt", false); 
var htr = new HtmlTextWriter(sr); 

foreach (WebPart part in partMgr.WebParts) 
{ 
    if (part.GetType() == new DataFormWebPart().GetType()) 
    { 
     try 
     { 
      htr.WriteLine(""); 
      part.RenderBeginTag(htr); 
      htr.WriteLine(""); 
      part.RenderControl(htr); 
      htr.WriteLine(""); 
      part.RenderEndTag(htr); 
      htr.WriteLine(""); 
     } 
     catch (Exception exc) 
     { 
      htr.WriteLine("Message: " + exc.Message); 
      htr.WriteLine("StackTrace: " + exc.StackTrace); 
      htr.WriteLine("InnerException: " + (exc.InnerException == null).ToString()); 
     } 
    } 
} 
sr.Close(); 
htr.Close(); 

La sortie:

<div id="g_1722aa69_d0d7_4804_83fa_c8f4a250080a"> 
    Message: Value cannot be null. Parameter name: page 
    StackTrace: at System.Web.UI.WebControls.WebParts.WebPartManager.GetCurrentWebPartManager(Page page) 
    at Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter writer) 
    at ExtractPageData.Program.Main(String[] args) in D:\DNR-Playground\ExtractPageData\ExtractPageData\Program.cs:line 49 
    InnerException: False 

    <div id="g_1115045e_b0d7_41ce_ad19_15aab0f3871d"> 
     Message: Value cannot be null. Parameter name: page 
     StackTrace: at System.Web.UI.WebControls.WebParts.WebPartManager.GetCurrentWebPartManager(Page page) 
    at Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter writer) 
    at ExtractPageData.Program.Main(String[] args) in D:\DNR-Playground\ExtractPageData\ExtractPageData\Program.cs:line 49 
     InnerException: False 

Comme vous pouvez le voir dans la sortie, la balise de début est rendu, mais le contrôle ne peut être rendue en raison de part.Page est null et c'est un attribut en lecture seule.

Répondre

0

Cela ne fonctionne tout simplement pas. Les composants WebPart nécessitent la configuration correcte SPContext lors de la gestion des requêtes HTTP dans le pipeline ASP.NET. Il n'y a pas de réponse facile pour le surmonter. Vous devez essentiellement simuler une requête HTTP à la page que vous devez rendre en mémoire.


De plus, cette expression part.GetType() == new DataFormWebPart().GetType() est loin d'être idéale. Utilisez plutôt part.GetType() == typeof(DataFormWebPart) pour empêcher l'instanciation et d'éventuels effets secondaires indésirables.

Questions connexes