0

我有一个使用 MOSS 2007 构建的发布网站,我需要以编程方式获取页面内容。我知道我可以使用 WebClient 向页面发送请求,然后解析响应文本。但我想在 SharePoint 模型中这样做,因为规模很大。

我要呈现的 Web 部件是 DataFormWebPart,如果在浏览器中查看,它们会显示得很好。但是在尝试以编程方式呈现它们时出现异常。

编码:

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

输出:

<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

part.Page正如您在输出中看到的那样,开始标记已呈现,但控件由于is而无法呈现,null并且它是只读属性。

4

1 回答 1

0

这只是行不通。Web 部件需要SPContext在 ASP.NET 管道中处理 HTTP 请求期间正确设置。如何克服它没有简单的答案。您基本上必须模拟对需要在内存中呈现的页面的 HTTP 请求。


而且,这种表达方式part.GetType() == new DataFormWebPart().GetType()也很不理想。而是用于part.GetType() == typeof(DataFormWebPart)防止实例化和可能的不需要的副作用。

于 2012-02-17T21:27:53.807 回答