簡體   English   中英

如何以編程方式呈現DataFormWebPart?

[英]How to programmatically render DataFormWebPart?

我有一個使用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

從輸出中可以看到,呈現了begin標簽,但是由於part.Pagenull ,因此無法呈現控件,這是一個只讀屬性。

這只是行不通的。 Web部件需要正確的SPContext ,該SPContext是在ASP.NET管道中的HTTP請求處理期間設置的。 沒有簡單的答案可以克服。 本質上,您將必須模擬對內存中呈現的頁面的HTTP請求。


此外,此表達式part.GetType() == new DataFormWebPart().GetType()也不理想。 而是使用part.GetType() == typeof(DataFormWebPart)來防止實例化和可能的有害副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM