Domanda

Ho un sito web di pubblicazione realizzato con MOSS 2007 e ho bisogno di ottenere il contenuto della pagina in modo programmatico.So che posso utilizzare WebClient per inviare una richiesta alla pagina e quindi analizzare il testo della risposta.Ma voglio farlo nel modello SharePoint poiché la scala è abbastanza grande.

Le parti web che voglio rendere sono DataFormWebPart e vengono visualizzate bene se visualizzate in un browser.Ma ottengo delle eccezioni quando provo a renderli in modo programmatico.

Il codice:

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();

L'output:

<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

Come puoi vedere nell'output, il tag di inizio viene visualizzato ma il controllo non può essere visualizzato poiché part.Page è null ed è un attributo di sola lettura.

È stato utile?

Soluzione

Questo semplicemente non funzionerà.Le web part richiedono SPContext appropriato che viene impostato durante la gestione delle richieste HTTP nella pipeline ASP.NET.Non c'è una risposta facile su come superarlo.Dovresti essenzialmente simulare una richiesta HTTP alla pagina di cui devi eseguire il rendering in memoria.


Inoltre, questa espressione part.GetType() == new DataFormWebPart().GetType() è tutt'altro che ideale.Utilizza piuttosto part.GetType() == typeof(DataFormWebPart) per prevenire la creazione di istanze e possibili effetti collaterali indesiderati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top