Come eseguire il rendering a livello di codice di DataFormWebPart?
-
27-10-2019 - |
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.
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.