Frage

Ich habe eine Veröffentlichungswebsite mit MOSS 2007 erstellt und muss den Seiteninhalt programmgesteuert abrufen.Ich weiß, dass ich WebClient verwenden kann, um eine Anfrage an die Seite zu senden und dann den Antworttext zu analysieren.Aber ich möchte es im SharePoint-Modell tun, da der Maßstab ziemlich groß ist.

Die Webparta, die ich rendern möchte, sind DataFormWebPart und werden in einem Browser gut angezeigt.Aber ich bekomme Ausnahmen, wenn ich versuche, sie programmgesteuert zu rendern.

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

Die Ausgabe:

<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

Wie Sie in der Ausgabe sehen können, wird das begin-Tag gerendert, aber das Steuerelement kann nicht gerendert werden, da part.Page null ist und es sich um ein schreibgeschütztes Attribut handelt.

War es hilfreich?

Lösung

Das funktioniert einfach nicht.Webparts erfordern den richtigen SPContext, der während der Verarbeitung von HTTP-Anforderungen in der ASP.NET-Pipeline eingerichtet wird.Es gibt keine einfache Antwort, wie man es überwinden kann.Sie müssten im Wesentlichen eine HTTP-Anforderung für die Seite simulieren, die Sie im Speicher rendern müssen.


Auch dieser Ausdruck part.GetType() == new DataFormWebPart().GetType() ist alles andere als ideal.Verwenden Sie lieber part.GetType() == typeof(DataFormWebPart), um Instanziierung und mögliche unerwünschte Nebenwirkungen zu verhindern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top