0

私はMOSS 2007で公開ウェブサイトを構築しており、ページコンテンツをプログラムで取得する必要があります。 WebClientを使用してページにリクエストを送信し、レスポンステキストを解析することができます。しかし、スケールが静かなので、SharePointモデルでやりたいDataFormWebPartをプログラムでレンダリングする方法

レンダリングしたい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にレンダリングすることはできません開始がnullですそれは読み取り専用の属性です。

答えて

0

これは機能しません。 Webパーツには、適切なSPContextが必要です。これは、ASP.NETパイプラインのHTTP要求処理中にセットアップされます。それを克服する簡単な答えはありません。基本的には、メモリ内でレンダリングする必要があるページへのHTTPリクエストをシミュレートする必要があります。


また、この式part.GetType() == new DataFormWebPart().GetType()は理想からほど遠いです。むしろpart.GetType() == typeof(DataFormWebPart)を使用して、インスタンス化や不要な副作用を防ぐことができます。

関連する問題