我有一个使用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
为null
而无法呈现控件,并且它是一个只读属性。
答案 0 :(得分:0)
这是行不通的。 Web部件需要正确的SPContext
,这是在ASP.NET管道中的HTTP请求处理期间设置的。如何克服它并不容易。您基本上必须模拟对需要在内存中呈现的页面的HTTP请求。
此外,这个表达式part.GetType() == new DataFormWebPart().GetType()
远非理想。而是使用part.GetType() == typeof(DataFormWebPart)
来防止实例化和可能的不良副作用。